clear
#3060a5
#b16b6b
#ffffff
clear
#b16b6b
#6bb18c
#ffffff
clear
#6bb18c
#ffffa7
#313131
#ffffa7
#313131
#e9e9e9
#000000
dnd.gif
show
yes
{
    "tiddlers": {
        "$:/Acknowledgements": {
            "title": "$:/Acknowledgements",
            "text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
        },
        "$:/core/copyright.txt": {
            "title": "$:/core/copyright.txt",
            "type": "text/plain",
            "text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
        },
        "$:/core/icon": {
            "title": "$:/core/icon",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
        },
        "$:/core/images/add-comment": {
            "title": "$:/core/images/add-comment",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
        },
        "$:/core/images/advanced-search-button": {
            "title": "$:/core/images/advanced-search-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
        },
        "$:/core/images/auto-height": {
            "title": "$:/core/images/auto-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/blank": {
            "title": "$:/core/images/blank",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
        },
        "$:/core/images/bold": {
            "title": "$:/core/images/bold",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
        },
        "$:/core/images/cancel-button": {
            "title": "$:/core/images/cancel-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
        },
        "$:/core/images/chevron-down": {
            "title": "$:/core/images/chevron-down",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
        },
        "$:/core/images/chevron-left": {
            "title": "$:/core/images/chevron-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-right": {
            "title": "$:/core/images/chevron-right",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-up": {
            "title": "$:/core/images/chevron-up",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
        },
        "$:/core/images/clone-button": {
            "title": "$:/core/images/clone-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
        },
        "$:/core/images/close-all-button": {
            "title": "$:/core/images/close-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
        },
        "$:/core/images/close-button": {
            "title": "$:/core/images/close-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
        },
        "$:/core/images/close-others-button": {
            "title": "$:/core/images/close-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/copy-clipboard": {
            "title": "$:/core/images/copy-clipboard",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
        },
        "$:/core/images/delete-button": {
            "title": "$:/core/images/delete-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/done-button": {
            "title": "$:/core/images/done-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
        },
        "$:/core/images/down-arrow": {
            "title": "$:/core/images/down-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
        },
        "$:/core/images/download-button": {
            "title": "$:/core/images/download-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
        },
        "$:/core/images/edit-button": {
            "title": "$:/core/images/edit-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
        },
        "$:/core/images/erase": {
            "title": "$:/core/images/erase",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
        },
        "$:/core/images/excise": {
            "title": "$:/core/images/excise",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
        },
        "$:/core/images/export-button": {
            "title": "$:/core/images/export-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
        },
        "$:/core/images/file": {
            "title": "$:/core/images/file",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
        },
        "$:/core/images/fixed-height": {
            "title": "$:/core/images/fixed-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/fold-all-button": {
            "title": "$:/core/images/fold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
        },
        "$:/core/images/fold-button": {
            "title": "$:/core/images/fold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
        },
        "$:/core/images/fold-others-button": {
            "title": "$:/core/images/fold-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/folder": {
            "title": "$:/core/images/folder",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
        },
        "$:/core/images/full-screen-button": {
            "title": "$:/core/images/full-screen-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
        },
        "$:/core/images/github": {
            "title": "$:/core/images/github",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
        },
        "$:/core/images/gitter": {
            "title": "$:/core/images/gitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
        },
        "$:/core/images/globe": {
            "title": "$:/core/images/globe",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
        },
        "$:/core/images/heading-1": {
            "title": "$:/core/images/heading-1",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
        },
        "$:/core/images/heading-2": {
            "title": "$:/core/images/heading-2",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
        },
        "$:/core/images/heading-3": {
            "title": "$:/core/images/heading-3",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
        },
        "$:/core/images/heading-4": {
            "title": "$:/core/images/heading-4",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
        },
        "$:/core/images/heading-5": {
            "title": "$:/core/images/heading-5",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
        },
        "$:/core/images/heading-6": {
            "title": "$:/core/images/heading-6",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
        },
        "$:/core/images/help": {
            "title": "$:/core/images/help",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
        },
        "$:/core/images/home-button": {
            "title": "$:/core/images/home-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
        },
        "$:/core/images/import-button": {
            "title": "$:/core/images/import-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
        },
        "$:/core/images/info-button": {
            "title": "$:/core/images/info-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/italic": {
            "title": "$:/core/images/italic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
        },
        "$:/core/images/left-arrow": {
            "title": "$:/core/images/left-arrow",
            "created": "20150315234410875",
            "modified": "20150315235324760",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
        },
        "$:/core/images/line-width": {
            "title": "$:/core/images/line-width",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/link": {
            "title": "$:/core/images/link",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
        },
        "$:/core/images/linkify": {
            "title": "$:/core/images/linkify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
        },
        "$:/core/images/list-bullet": {
            "title": "$:/core/images/list-bullet",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
        },
        "$:/core/images/list-number": {
            "title": "$:/core/images/list-number",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
        },
        "$:/core/images/list": {
            "title": "$:/core/images/list",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
        },
        "$:/core/images/locked-padlock": {
            "title": "$:/core/images/locked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/mail": {
            "title": "$:/core/images/mail",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
        },
        "$:/core/images/menu-button": {
            "title": "$:/core/images/menu-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
        },
        "$:/core/images/mono-block": {
            "title": "$:/core/images/mono-block",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
        },
        "$:/core/images/mono-line": {
            "title": "$:/core/images/mono-line",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
        },
        "$:/core/images/new-button": {
            "title": "$:/core/images/new-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
        },
        "$:/core/images/new-here-button": {
            "title": "$:/core/images/new-here-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/new-image-button": {
            "title": "$:/core/images/new-image-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
        },
        "$:/core/images/new-journal-button": {
            "title": "$:/core/images/new-journal-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
        },
        "$:/core/images/opacity": {
            "title": "$:/core/images/opacity",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
        },
        "$:/core/images/open-window": {
            "title": "$:/core/images/open-window",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
        },
        "$:/core/images/options-button": {
            "title": "$:/core/images/options-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
        },
        "$:/core/images/paint": {
            "title": "$:/core/images/paint",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
        },
        "$:/core/images/palette": {
            "title": "$:/core/images/palette",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
        },
        "$:/core/images/permalink-button": {
            "title": "$:/core/images/permalink-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
        },
        "$:/core/images/permaview-button": {
            "title": "$:/core/images/permaview-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
        },
        "$:/core/images/picture": {
            "title": "$:/core/images/picture",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
        },
        "$:/core/images/plugin-generic-language": {
            "title": "$:/core/images/plugin-generic-language",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-plugin": {
            "title": "$:/core/images/plugin-generic-plugin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-theme": {
            "title": "$:/core/images/plugin-generic-theme",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
        },
        "$:/core/images/preview-closed": {
            "title": "$:/core/images/preview-closed",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
        },
        "$:/core/images/preview-open": {
            "title": "$:/core/images/preview-open",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
        },
        "$:/core/images/print-button": {
            "title": "$:/core/images/print-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
        },
        "$:/core/images/quote": {
            "title": "$:/core/images/quote",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
        },
        "$:/core/images/refresh-button": {
            "title": "$:/core/images/refresh-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
        },
        "$:/core/images/right-arrow": {
            "title": "$:/core/images/right-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
        },
        "$:/core/images/rotate-left": {
            "title": "$:/core/images/rotate-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
        },
        "$:/core/images/save-button": {
            "title": "$:/core/images/save-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
        },
        "$:/core/images/size": {
            "title": "$:/core/images/size",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
        },
        "$:/core/images/spiral": {
            "title": "$:/core/images/spiral",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
        },
        "$:/core/images/stamp": {
            "title": "$:/core/images/stamp",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
        },
        "$:/core/images/star-filled": {
            "title": "$:/core/images/star-filled",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
        },
        "$:/core/images/storyview-classic": {
            "title": "$:/core/images/storyview-classic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-pop": {
            "title": "$:/core/images/storyview-pop",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-zoomin": {
            "title": "$:/core/images/storyview-zoomin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
        },
        "$:/core/images/strikethrough": {
            "title": "$:/core/images/strikethrough",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
        },
        "$:/core/images/subscript": {
            "title": "$:/core/images/subscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/superscript": {
            "title": "$:/core/images/superscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/tag-button": {
            "title": "$:/core/images/tag-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
        },
        "$:/core/images/theme-button": {
            "title": "$:/core/images/theme-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
        },
        "$:/core/images/timestamp-off": {
            "title": "$:/core/images/timestamp-off",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
        },
        "$:/core/images/timestamp-on": {
            "title": "$:/core/images/timestamp-on",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
        },
        "$:/core/images/tip": {
            "title": "$:/core/images/tip",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
        },
        "$:/core/images/transcludify": {
            "title": "$:/core/images/transcludify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
        },
        "$:/core/images/twitter": {
            "title": "$:/core/images/twitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
        },
        "$:/core/images/underline": {
            "title": "$:/core/images/underline",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
        },
        "$:/core/images/unfold-all-button": {
            "title": "$:/core/images/unfold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unfold-button": {
            "title": "$:/core/images/unfold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unlocked-padlock": {
            "title": "$:/core/images/unlocked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/up-arrow": {
            "title": "$:/core/images/up-arrow",
            "created": "20150316000544368",
            "modified": "20150316000831867",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
        },
        "$:/core/images/video": {
            "title": "$:/core/images/video",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
        },
        "$:/core/images/warning": {
            "title": "$:/core/images/warning",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
        },
        "$:/language/Buttons/AdvancedSearch/Caption": {
            "title": "$:/language/Buttons/AdvancedSearch/Caption",
            "text": "advanced search"
        },
        "$:/language/Buttons/AdvancedSearch/Hint": {
            "title": "$:/language/Buttons/AdvancedSearch/Hint",
            "text": "Advanced search"
        },
        "$:/language/Buttons/Cancel/Caption": {
            "title": "$:/language/Buttons/Cancel/Caption",
            "text": "cancel"
        },
        "$:/language/Buttons/Cancel/Hint": {
            "title": "$:/language/Buttons/Cancel/Hint",
            "text": "Discard changes to this tiddler"
        },
        "$:/language/Buttons/Clone/Caption": {
            "title": "$:/language/Buttons/Clone/Caption",
            "text": "clone"
        },
        "$:/language/Buttons/Clone/Hint": {
            "title": "$:/language/Buttons/Clone/Hint",
            "text": "Clone this tiddler"
        },
        "$:/language/Buttons/Close/Caption": {
            "title": "$:/language/Buttons/Close/Caption",
            "text": "close"
        },
        "$:/language/Buttons/Close/Hint": {
            "title": "$:/language/Buttons/Close/Hint",
            "text": "Close this tiddler"
        },
        "$:/language/Buttons/CloseAll/Caption": {
            "title": "$:/language/Buttons/CloseAll/Caption",
            "text": "close all"
        },
        "$:/language/Buttons/CloseAll/Hint": {
            "title": "$:/language/Buttons/CloseAll/Hint",
            "text": "Close all tiddlers"
        },
        "$:/language/Buttons/CloseOthers/Caption": {
            "title": "$:/language/Buttons/CloseOthers/Caption",
            "text": "close others"
        },
        "$:/language/Buttons/CloseOthers/Hint": {
            "title": "$:/language/Buttons/CloseOthers/Hint",
            "text": "Close other tiddlers"
        },
        "$:/language/Buttons/ControlPanel/Caption": {
            "title": "$:/language/Buttons/ControlPanel/Caption",
            "text": "control panel"
        },
        "$:/language/Buttons/ControlPanel/Hint": {
            "title": "$:/language/Buttons/ControlPanel/Hint",
            "text": "Open control panel"
        },
        "$:/language/Buttons/CopyToClipboard/Caption": {
            "title": "$:/language/Buttons/CopyToClipboard/Caption",
            "text": "copy to clipboard"
        },
        "$:/language/Buttons/CopyToClipboard/Hint": {
            "title": "$:/language/Buttons/CopyToClipboard/Hint",
            "text": "Copy this text to the clipboard"
        },
        "$:/language/Buttons/Delete/Caption": {
            "title": "$:/language/Buttons/Delete/Caption",
            "text": "delete"
        },
        "$:/language/Buttons/Delete/Hint": {
            "title": "$:/language/Buttons/Delete/Hint",
            "text": "Delete this tiddler"
        },
        "$:/language/Buttons/Edit/Caption": {
            "title": "$:/language/Buttons/Edit/Caption",
            "text": "edit"
        },
        "$:/language/Buttons/Edit/Hint": {
            "title": "$:/language/Buttons/Edit/Hint",
            "text": "Edit this tiddler"
        },
        "$:/language/Buttons/Encryption/Caption": {
            "title": "$:/language/Buttons/Encryption/Caption",
            "text": "encryption"
        },
        "$:/language/Buttons/Encryption/Hint": {
            "title": "$:/language/Buttons/Encryption/Hint",
            "text": "Set or clear a password for saving this wiki"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
            "text": "clear password"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
            "text": "Clear the password and save this wiki without encryption"
        },
        "$:/language/Buttons/Encryption/SetPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Caption",
            "text": "set password"
        },
        "$:/language/Buttons/Encryption/SetPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Hint",
            "text": "Set a password for saving this wiki with encryption"
        },
        "$:/language/Buttons/ExportPage/Caption": {
            "title": "$:/language/Buttons/ExportPage/Caption",
            "text": "export all"
        },
        "$:/language/Buttons/ExportPage/Hint": {
            "title": "$:/language/Buttons/ExportPage/Hint",
            "text": "Export all tiddlers"
        },
        "$:/language/Buttons/ExportTiddler/Caption": {
            "title": "$:/language/Buttons/ExportTiddler/Caption",
            "text": "export tiddler"
        },
        "$:/language/Buttons/ExportTiddler/Hint": {
            "title": "$:/language/Buttons/ExportTiddler/Hint",
            "text": "Export tiddler"
        },
        "$:/language/Buttons/ExportTiddlers/Caption": {
            "title": "$:/language/Buttons/ExportTiddlers/Caption",
            "text": "export tiddlers"
        },
        "$:/language/Buttons/ExportTiddlers/Hint": {
            "title": "$:/language/Buttons/ExportTiddlers/Hint",
            "text": "Export tiddlers"
        },
        "$:/language/Buttons/SidebarSearch/Hint": {
            "title": "$:/language/Buttons/SidebarSearch/Hint",
            "text": "Select the sidebar search field"
        },
        "$:/language/Buttons/Fold/Caption": {
            "title": "$:/language/Buttons/Fold/Caption",
            "text": "fold tiddler"
        },
        "$:/language/Buttons/Fold/Hint": {
            "title": "$:/language/Buttons/Fold/Hint",
            "text": "Fold the body of this tiddler"
        },
        "$:/language/Buttons/Fold/FoldBar/Caption": {
            "title": "$:/language/Buttons/Fold/FoldBar/Caption",
            "text": "fold-bar"
        },
        "$:/language/Buttons/Fold/FoldBar/Hint": {
            "title": "$:/language/Buttons/Fold/FoldBar/Hint",
            "text": "Optional bars to fold and unfold tiddlers"
        },
        "$:/language/Buttons/Unfold/Caption": {
            "title": "$:/language/Buttons/Unfold/Caption",
            "text": "unfold tiddler"
        },
        "$:/language/Buttons/Unfold/Hint": {
            "title": "$:/language/Buttons/Unfold/Hint",
            "text": "Unfold the body of this tiddler"
        },
        "$:/language/Buttons/FoldOthers/Caption": {
            "title": "$:/language/Buttons/FoldOthers/Caption",
            "text": "fold other tiddlers"
        },
        "$:/language/Buttons/FoldOthers/Hint": {
            "title": "$:/language/Buttons/FoldOthers/Hint",
            "text": "Fold the bodies of other opened tiddlers"
        },
        "$:/language/Buttons/FoldAll/Caption": {
            "title": "$:/language/Buttons/FoldAll/Caption",
            "text": "fold all tiddlers"
        },
        "$:/language/Buttons/FoldAll/Hint": {
            "title": "$:/language/Buttons/FoldAll/Hint",
            "text": "Fold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Caption": {
            "title": "$:/language/Buttons/UnfoldAll/Caption",
            "text": "unfold all tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Hint": {
            "title": "$:/language/Buttons/UnfoldAll/Hint",
            "text": "Unfold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/FullScreen/Caption": {
            "title": "$:/language/Buttons/FullScreen/Caption",
            "text": "full-screen"
        },
        "$:/language/Buttons/FullScreen/Hint": {
            "title": "$:/language/Buttons/FullScreen/Hint",
            "text": "Enter or leave full-screen mode"
        },
        "$:/language/Buttons/Help/Caption": {
            "title": "$:/language/Buttons/Help/Caption",
            "text": "help"
        },
        "$:/language/Buttons/Help/Hint": {
            "title": "$:/language/Buttons/Help/Hint",
            "text": "Show help panel"
        },
        "$:/language/Buttons/Import/Caption": {
            "title": "$:/language/Buttons/Import/Caption",
            "text": "import"
        },
        "$:/language/Buttons/Import/Hint": {
            "title": "$:/language/Buttons/Import/Hint",
            "text": "Import many types of file including text, image, TiddlyWiki or JSON"
        },
        "$:/language/Buttons/Info/Caption": {
            "title": "$:/language/Buttons/Info/Caption",
            "text": "info"
        },
        "$:/language/Buttons/Info/Hint": {
            "title": "$:/language/Buttons/Info/Hint",
            "text": "Show information for this tiddler"
        },
        "$:/language/Buttons/Home/Caption": {
            "title": "$:/language/Buttons/Home/Caption",
            "text": "home"
        },
        "$:/language/Buttons/Home/Hint": {
            "title": "$:/language/Buttons/Home/Hint",
            "text": "Open the default tiddlers"
        },
        "$:/language/Buttons/Language/Caption": {
            "title": "$:/language/Buttons/Language/Caption",
            "text": "language"
        },
        "$:/language/Buttons/Language/Hint": {
            "title": "$:/language/Buttons/Language/Hint",
            "text": "Choose the user interface language"
        },
        "$:/language/Buttons/Manager/Caption": {
            "title": "$:/language/Buttons/Manager/Caption",
            "text": "tiddler manager"
        },
        "$:/language/Buttons/Manager/Hint": {
            "title": "$:/language/Buttons/Manager/Hint",
            "text": "Open tiddler manager"
        },
        "$:/language/Buttons/More/Caption": {
            "title": "$:/language/Buttons/More/Caption",
            "text": "more"
        },
        "$:/language/Buttons/More/Hint": {
            "title": "$:/language/Buttons/More/Hint",
            "text": "More actions"
        },
        "$:/language/Buttons/NewHere/Caption": {
            "title": "$:/language/Buttons/NewHere/Caption",
            "text": "new here"
        },
        "$:/language/Buttons/NewHere/Hint": {
            "title": "$:/language/Buttons/NewHere/Hint",
            "text": "Create a new tiddler tagged with this one"
        },
        "$:/language/Buttons/NewJournal/Caption": {
            "title": "$:/language/Buttons/NewJournal/Caption",
            "text": "new journal"
        },
        "$:/language/Buttons/NewJournal/Hint": {
            "title": "$:/language/Buttons/NewJournal/Hint",
            "text": "Create a new journal tiddler"
        },
        "$:/language/Buttons/NewJournalHere/Caption": {
            "title": "$:/language/Buttons/NewJournalHere/Caption",
            "text": "new journal here"
        },
        "$:/language/Buttons/NewJournalHere/Hint": {
            "title": "$:/language/Buttons/NewJournalHere/Hint",
            "text": "Create a new journal tiddler tagged with this one"
        },
        "$:/language/Buttons/NewImage/Caption": {
            "title": "$:/language/Buttons/NewImage/Caption",
            "text": "new image"
        },
        "$:/language/Buttons/NewImage/Hint": {
            "title": "$:/language/Buttons/NewImage/Hint",
            "text": "Create a new image tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Caption": {
            "title": "$:/language/Buttons/NewMarkdown/Caption",
            "text": "new Markdown tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Hint": {
            "title": "$:/language/Buttons/NewMarkdown/Hint",
            "text": "Create a new Markdown tiddler"
        },
        "$:/language/Buttons/NewTiddler/Caption": {
            "title": "$:/language/Buttons/NewTiddler/Caption",
            "text": "new tiddler"
        },
        "$:/language/Buttons/NewTiddler/Hint": {
            "title": "$:/language/Buttons/NewTiddler/Hint",
            "text": "Create a new tiddler"
        },
        "$:/language/Buttons/OpenWindow/Caption": {
            "title": "$:/language/Buttons/OpenWindow/Caption",
            "text": "open in new window"
        },
        "$:/language/Buttons/OpenWindow/Hint": {
            "title": "$:/language/Buttons/OpenWindow/Hint",
            "text": "Open tiddler in new window"
        },
        "$:/language/Buttons/Palette/Caption": {
            "title": "$:/language/Buttons/Palette/Caption",
            "text": "palette"
        },
        "$:/language/Buttons/Palette/Hint": {
            "title": "$:/language/Buttons/Palette/Hint",
            "text": "Choose the colour palette"
        },
        "$:/language/Buttons/Permalink/Caption": {
            "title": "$:/language/Buttons/Permalink/Caption",
            "text": "permalink"
        },
        "$:/language/Buttons/Permalink/Hint": {
            "title": "$:/language/Buttons/Permalink/Hint",
            "text": "Set browser address bar to a direct link to this tiddler"
        },
        "$:/language/Buttons/Permaview/Caption": {
            "title": "$:/language/Buttons/Permaview/Caption",
            "text": "permaview"
        },
        "$:/language/Buttons/Permaview/Hint": {
            "title": "$:/language/Buttons/Permaview/Hint",
            "text": "Set browser address bar to a direct link to all the tiddlers in this story"
        },
        "$:/language/Buttons/Print/Caption": {
            "title": "$:/language/Buttons/Print/Caption",
            "text": "print page"
        },
        "$:/language/Buttons/Print/Hint": {
            "title": "$:/language/Buttons/Print/Hint",
            "text": "Print the current page"
        },
        "$:/language/Buttons/Refresh/Caption": {
            "title": "$:/language/Buttons/Refresh/Caption",
            "text": "refresh"
        },
        "$:/language/Buttons/Refresh/Hint": {
            "title": "$:/language/Buttons/Refresh/Hint",
            "text": "Perform a full refresh of the wiki"
        },
        "$:/language/Buttons/Save/Caption": {
            "title": "$:/language/Buttons/Save/Caption",
            "text": "ok"
        },
        "$:/language/Buttons/Save/Hint": {
            "title": "$:/language/Buttons/Save/Hint",
            "text": "Confirm changes to this tiddler"
        },
        "$:/language/Buttons/SaveWiki/Caption": {
            "title": "$:/language/Buttons/SaveWiki/Caption",
            "text": "save changes"
        },
        "$:/language/Buttons/SaveWiki/Hint": {
            "title": "$:/language/Buttons/SaveWiki/Hint",
            "text": "Save changes"
        },
        "$:/language/Buttons/StoryView/Caption": {
            "title": "$:/language/Buttons/StoryView/Caption",
            "text": "storyview"
        },
        "$:/language/Buttons/StoryView/Hint": {
            "title": "$:/language/Buttons/StoryView/Hint",
            "text": "Choose the story visualisation"
        },
        "$:/language/Buttons/HideSideBar/Caption": {
            "title": "$:/language/Buttons/HideSideBar/Caption",
            "text": "hide sidebar"
        },
        "$:/language/Buttons/HideSideBar/Hint": {
            "title": "$:/language/Buttons/HideSideBar/Hint",
            "text": "Hide sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Caption": {
            "title": "$:/language/Buttons/ShowSideBar/Caption",
            "text": "show sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Hint": {
            "title": "$:/language/Buttons/ShowSideBar/Hint",
            "text": "Show sidebar"
        },
        "$:/language/Buttons/TagManager/Caption": {
            "title": "$:/language/Buttons/TagManager/Caption",
            "text": "tag manager"
        },
        "$:/language/Buttons/TagManager/Hint": {
            "title": "$:/language/Buttons/TagManager/Hint",
            "text": "Open tag manager"
        },
        "$:/language/Buttons/Timestamp/Caption": {
            "title": "$:/language/Buttons/Timestamp/Caption",
            "text": "timestamps"
        },
        "$:/language/Buttons/Timestamp/Hint": {
            "title": "$:/language/Buttons/Timestamp/Hint",
            "text": "Choose whether modifications update timestamps"
        },
        "$:/language/Buttons/Timestamp/On/Caption": {
            "title": "$:/language/Buttons/Timestamp/On/Caption",
            "text": "timestamps are on"
        },
        "$:/language/Buttons/Timestamp/On/Hint": {
            "title": "$:/language/Buttons/Timestamp/On/Hint",
            "text": "Update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Timestamp/Off/Caption": {
            "title": "$:/language/Buttons/Timestamp/Off/Caption",
            "text": "timestamps are off"
        },
        "$:/language/Buttons/Timestamp/Off/Hint": {
            "title": "$:/language/Buttons/Timestamp/Off/Hint",
            "text": "Don't update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Theme/Caption": {
            "title": "$:/language/Buttons/Theme/Caption",
            "text": "theme"
        },
        "$:/language/Buttons/Theme/Hint": {
            "title": "$:/language/Buttons/Theme/Hint",
            "text": "Choose the display theme"
        },
        "$:/language/Buttons/Bold/Caption": {
            "title": "$:/language/Buttons/Bold/Caption",
            "text": "bold"
        },
        "$:/language/Buttons/Bold/Hint": {
            "title": "$:/language/Buttons/Bold/Hint",
            "text": "Apply bold formatting to selection"
        },
        "$:/language/Buttons/Clear/Caption": {
            "title": "$:/language/Buttons/Clear/Caption",
            "text": "clear"
        },
        "$:/language/Buttons/Clear/Hint": {
            "title": "$:/language/Buttons/Clear/Hint",
            "text": "Clear image to solid colour"
        },
        "$:/language/Buttons/EditorHeight/Caption": {
            "title": "$:/language/Buttons/EditorHeight/Caption",
            "text": "editor height"
        },
        "$:/language/Buttons/EditorHeight/Caption/Auto": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Auto",
            "text": "Automatically adjust height to fit content"
        },
        "$:/language/Buttons/EditorHeight/Caption/Fixed": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
            "text": "Fixed height:"
        },
        "$:/language/Buttons/EditorHeight/Hint": {
            "title": "$:/language/Buttons/EditorHeight/Hint",
            "text": "Choose the height of the text editor"
        },
        "$:/language/Buttons/Excise/Caption": {
            "title": "$:/language/Buttons/Excise/Caption",
            "text": "excise"
        },
        "$:/language/Buttons/Excise/Caption/Excise": {
            "title": "$:/language/Buttons/Excise/Caption/Excise",
            "text": "Perform excision"
        },
        "$:/language/Buttons/Excise/Caption/MacroName": {
            "title": "$:/language/Buttons/Excise/Caption/MacroName",
            "text": "Macro name:"
        },
        "$:/language/Buttons/Excise/Caption/NewTitle": {
            "title": "$:/language/Buttons/Excise/Caption/NewTitle",
            "text": "Title of new tiddler:"
        },
        "$:/language/Buttons/Excise/Caption/Replace": {
            "title": "$:/language/Buttons/Excise/Caption/Replace",
            "text": "Replace excised text with:"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Macro": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
            "text": "macro"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Link": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Link",
            "text": "link"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
            "text": "transclusion"
        },
        "$:/language/Buttons/Excise/Caption/Tag": {
            "title": "$:/language/Buttons/Excise/Caption/Tag",
            "text": "Tag new tiddler with the title of this tiddler"
        },
        "$:/language/Buttons/Excise/Caption/TiddlerExists": {
            "title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
            "text": "Warning: tiddler already exists"
        },
        "$:/language/Buttons/Excise/Hint": {
            "title": "$:/language/Buttons/Excise/Hint",
            "text": "Excise the selected text into a new tiddler"
        },
        "$:/language/Buttons/Heading1/Caption": {
            "title": "$:/language/Buttons/Heading1/Caption",
            "text": "heading 1"
        },
        "$:/language/Buttons/Heading1/Hint": {
            "title": "$:/language/Buttons/Heading1/Hint",
            "text": "Apply heading level 1 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading2/Caption": {
            "title": "$:/language/Buttons/Heading2/Caption",
            "text": "heading 2"
        },
        "$:/language/Buttons/Heading2/Hint": {
            "title": "$:/language/Buttons/Heading2/Hint",
            "text": "Apply heading level 2 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading3/Caption": {
            "title": "$:/language/Buttons/Heading3/Caption",
            "text": "heading 3"
        },
        "$:/language/Buttons/Heading3/Hint": {
            "title": "$:/language/Buttons/Heading3/Hint",
            "text": "Apply heading level 3 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading4/Caption": {
            "title": "$:/language/Buttons/Heading4/Caption",
            "text": "heading 4"
        },
        "$:/language/Buttons/Heading4/Hint": {
            "title": "$:/language/Buttons/Heading4/Hint",
            "text": "Apply heading level 4 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading5/Caption": {
            "title": "$:/language/Buttons/Heading5/Caption",
            "text": "heading 5"
        },
        "$:/language/Buttons/Heading5/Hint": {
            "title": "$:/language/Buttons/Heading5/Hint",
            "text": "Apply heading level 5 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading6/Caption": {
            "title": "$:/language/Buttons/Heading6/Caption",
            "text": "heading 6"
        },
        "$:/language/Buttons/Heading6/Hint": {
            "title": "$:/language/Buttons/Heading6/Hint",
            "text": "Apply heading level 6 formatting to lines containing selection"
        },
        "$:/language/Buttons/Italic/Caption": {
            "title": "$:/language/Buttons/Italic/Caption",
            "text": "italic"
        },
        "$:/language/Buttons/Italic/Hint": {
            "title": "$:/language/Buttons/Italic/Hint",
            "text": "Apply italic formatting to selection"
        },
        "$:/language/Buttons/LineWidth/Caption": {
            "title": "$:/language/Buttons/LineWidth/Caption",
            "text": "line width"
        },
        "$:/language/Buttons/LineWidth/Hint": {
            "title": "$:/language/Buttons/LineWidth/Hint",
            "text": "Set line width for painting"
        },
        "$:/language/Buttons/Link/Caption": {
            "title": "$:/language/Buttons/Link/Caption",
            "text": "link"
        },
        "$:/language/Buttons/Link/Hint": {
            "title": "$:/language/Buttons/Link/Hint",
            "text": "Create wikitext link"
        },
        "$:/language/Buttons/Linkify/Caption": {
            "title": "$:/language/Buttons/Linkify/Caption",
            "text": "wikilink"
        },
        "$:/language/Buttons/Linkify/Hint": {
            "title": "$:/language/Buttons/Linkify/Hint",
            "text": "Wrap selection in square brackets"
        },
        "$:/language/Buttons/ListBullet/Caption": {
            "title": "$:/language/Buttons/ListBullet/Caption",
            "text": "bulleted list"
        },
        "$:/language/Buttons/ListBullet/Hint": {
            "title": "$:/language/Buttons/ListBullet/Hint",
            "text": "Apply bulleted list formatting to lines containing selection"
        },
        "$:/language/Buttons/ListNumber/Caption": {
            "title": "$:/language/Buttons/ListNumber/Caption",
            "text": "numbered list"
        },
        "$:/language/Buttons/ListNumber/Hint": {
            "title": "$:/language/Buttons/ListNumber/Hint",
            "text": "Apply numbered list formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoBlock/Caption": {
            "title": "$:/language/Buttons/MonoBlock/Caption",
            "text": "monospaced block"
        },
        "$:/language/Buttons/MonoBlock/Hint": {
            "title": "$:/language/Buttons/MonoBlock/Hint",
            "text": "Apply monospaced block formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoLine/Caption": {
            "title": "$:/language/Buttons/MonoLine/Caption",
            "text": "monospaced"
        },
        "$:/language/Buttons/MonoLine/Hint": {
            "title": "$:/language/Buttons/MonoLine/Hint",
            "text": "Apply monospaced character formatting to selection"
        },
        "$:/language/Buttons/Opacity/Caption": {
            "title": "$:/language/Buttons/Opacity/Caption",
            "text": "opacity"
        },
        "$:/language/Buttons/Opacity/Hint": {
            "title": "$:/language/Buttons/Opacity/Hint",
            "text": "Set painting opacity"
        },
        "$:/language/Buttons/Paint/Caption": {
            "title": "$:/language/Buttons/Paint/Caption",
            "text": "paint colour"
        },
        "$:/language/Buttons/Paint/Hint": {
            "title": "$:/language/Buttons/Paint/Hint",
            "text": "Set painting colour"
        },
        "$:/language/Buttons/Picture/Caption": {
            "title": "$:/language/Buttons/Picture/Caption",
            "text": "picture"
        },
        "$:/language/Buttons/Picture/Hint": {
            "title": "$:/language/Buttons/Picture/Hint",
            "text": "Insert picture"
        },
        "$:/language/Buttons/Preview/Caption": {
            "title": "$:/language/Buttons/Preview/Caption",
            "text": "preview"
        },
        "$:/language/Buttons/Preview/Hint": {
            "title": "$:/language/Buttons/Preview/Hint",
            "text": "Show preview pane"
        },
        "$:/language/Buttons/PreviewType/Caption": {
            "title": "$:/language/Buttons/PreviewType/Caption",
            "text": "preview type"
        },
        "$:/language/Buttons/PreviewType/Hint": {
            "title": "$:/language/Buttons/PreviewType/Hint",
            "text": "Choose preview type"
        },
        "$:/language/Buttons/Quote/Caption": {
            "title": "$:/language/Buttons/Quote/Caption",
            "text": "quote"
        },
        "$:/language/Buttons/Quote/Hint": {
            "title": "$:/language/Buttons/Quote/Hint",
            "text": "Apply quoted text formatting to lines containing selection"
        },
        "$:/language/Buttons/RotateLeft/Caption": {
            "title": "$:/language/Buttons/RotateLeft/Caption",
            "text": "rotate left"
        },
        "$:/language/Buttons/RotateLeft/Hint": {
            "title": "$:/language/Buttons/RotateLeft/Hint",
            "text": "Rotate image left by 90 degrees"
        },
        "$:/language/Buttons/Size/Caption": {
            "title": "$:/language/Buttons/Size/Caption",
            "text": "image size"
        },
        "$:/language/Buttons/Size/Caption/Height": {
            "title": "$:/language/Buttons/Size/Caption/Height",
            "text": "Height:"
        },
        "$:/language/Buttons/Size/Caption/Resize": {
            "title": "$:/language/Buttons/Size/Caption/Resize",
            "text": "Resize image"
        },
        "$:/language/Buttons/Size/Caption/Width": {
            "title": "$:/language/Buttons/Size/Caption/Width",
            "text": "Width:"
        },
        "$:/language/Buttons/Size/Hint": {
            "title": "$:/language/Buttons/Size/Hint",
            "text": "Set image size"
        },
        "$:/language/Buttons/Stamp/Caption": {
            "title": "$:/language/Buttons/Stamp/Caption",
            "text": "stamp"
        },
        "$:/language/Buttons/Stamp/Caption/New": {
            "title": "$:/language/Buttons/Stamp/Caption/New",
            "text": "Add your own"
        },
        "$:/language/Buttons/Stamp/Hint": {
            "title": "$:/language/Buttons/Stamp/Hint",
            "text": "Insert a preconfigured snippet of text"
        },
        "$:/language/Buttons/Stamp/New/Title": {
            "title": "$:/language/Buttons/Stamp/New/Title",
            "text": "Name as shown in menu"
        },
        "$:/language/Buttons/Stamp/New/Text": {
            "title": "$:/language/Buttons/Stamp/New/Text",
            "text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
        },
        "$:/language/Buttons/Strikethrough/Caption": {
            "title": "$:/language/Buttons/Strikethrough/Caption",
            "text": "strikethrough"
        },
        "$:/language/Buttons/Strikethrough/Hint": {
            "title": "$:/language/Buttons/Strikethrough/Hint",
            "text": "Apply strikethrough formatting to selection"
        },
        "$:/language/Buttons/Subscript/Caption": {
            "title": "$:/language/Buttons/Subscript/Caption",
            "text": "subscript"
        },
        "$:/language/Buttons/Subscript/Hint": {
            "title": "$:/language/Buttons/Subscript/Hint",
            "text": "Apply subscript formatting to selection"
        },
        "$:/language/Buttons/Superscript/Caption": {
            "title": "$:/language/Buttons/Superscript/Caption",
            "text": "superscript"
        },
        "$:/language/Buttons/Superscript/Hint": {
            "title": "$:/language/Buttons/Superscript/Hint",
            "text": "Apply superscript formatting to selection"
        },
        "$:/language/Buttons/ToggleSidebar/Hint": {
            "title": "$:/language/Buttons/ToggleSidebar/Hint",
            "text": "Toggle the sidebar visibility"
        },
        "$:/language/Buttons/Transcludify/Caption": {
            "title": "$:/language/Buttons/Transcludify/Caption",
            "text": "transclusion"
        },
        "$:/language/Buttons/Transcludify/Hint": {
            "title": "$:/language/Buttons/Transcludify/Hint",
            "text": "Wrap selection in curly brackets"
        },
        "$:/language/Buttons/Underline/Caption": {
            "title": "$:/language/Buttons/Underline/Caption",
            "text": "underline"
        },
        "$:/language/Buttons/Underline/Hint": {
            "title": "$:/language/Buttons/Underline/Hint",
            "text": "Apply underline formatting to selection"
        },
        "$:/language/ControlPanel/Advanced/Caption": {
            "title": "$:/language/ControlPanel/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/ControlPanel/Advanced/Hint": {
            "title": "$:/language/ControlPanel/Advanced/Hint",
            "text": "Internal information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/Appearance/Caption": {
            "title": "$:/language/ControlPanel/Appearance/Caption",
            "text": "Appearance"
        },
        "$:/language/ControlPanel/Appearance/Hint": {
            "title": "$:/language/ControlPanel/Appearance/Hint",
            "text": "Ways to customise the appearance of your TiddlyWiki."
        },
        "$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
            "text": "Animation duration"
        },
        "$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
            "text": "Default focus field for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/Caption": {
            "title": "$:/language/ControlPanel/Basics/Caption",
            "text": "Basics"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
            "text": "Use &#91;&#91;double square brackets&#93;&#93; for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
            "text": "Default tiddlers"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
            "text": "Choose which tiddlers are displayed at startup"
        },
        "$:/language/ControlPanel/Basics/Language/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Language/Prompt",
            "text": "Hello! Current language:"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
            "text": "Title of new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
            "text": "Text for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
            "text": "Tags for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
            "text": "Title of new tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
            "text": "Tags for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
            "text": "Number of overridden shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/RemoveTags": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags",
            "text": "Update to current format"
        },
        "$:/language/ControlPanel/Basics/RemoveTags/Hint": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags/Hint",
            "text": "Update the tags configuration to the latest format"
        },
        "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
            "text": "Number of shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/Subtitle/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
            "text": "Subtitle"
        },
        "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
            "text": "Number of system tiddlers"
        },
        "$:/language/ControlPanel/Basics/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tags/Prompt",
            "text": "Number of tags"
        },
        "$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
            "text": "Number of tiddlers"
        },
        "$:/language/ControlPanel/Basics/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Title/Prompt",
            "text": "Title of this ~TiddlyWiki"
        },
        "$:/language/ControlPanel/Basics/Username/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Username/Prompt",
            "text": "Username for signing edits"
        },
        "$:/language/ControlPanel/Basics/Version/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Version/Prompt",
            "text": "~TiddlyWiki version"
        },
        "$:/language/ControlPanel/EditorTypes/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Caption",
            "text": "Editor Types"
        },
        "$:/language/ControlPanel/EditorTypes/Editor/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
            "text": "Editor"
        },
        "$:/language/ControlPanel/EditorTypes/Hint": {
            "title": "$:/language/ControlPanel/EditorTypes/Hint",
            "text": "These tiddlers determine which editor is used to edit specific tiddler types."
        },
        "$:/language/ControlPanel/EditorTypes/Type/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
            "text": "Type"
        },
        "$:/language/ControlPanel/Info/Caption": {
            "title": "$:/language/ControlPanel/Info/Caption",
            "text": "Info"
        },
        "$:/language/ControlPanel/Info/Hint": {
            "title": "$:/language/ControlPanel/Info/Hint",
            "text": "Information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
            "text": "Type shortcut here"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
            "text": "add shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
            "text": "Keyboard Shortcuts"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
            "text": "Manage keyboard shortcut assignments"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
            "text": "No keyboard shortcuts assigned"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
            "text": "remove keyboard shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
            "text": "All platforms"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
            "text": "Macintosh platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
            "text": "Non-Macintosh platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
            "text": "Linux platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
            "text": "Non-Linux platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
            "text": "Windows platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
            "text": "Non-Windows platforms only"
        },
        "$:/language/ControlPanel/LayoutSwitcher/Caption": {
            "title": "$:/language/ControlPanel/LayoutSwitcher/Caption",
            "text": "Layout"
        },
        "$:/language/ControlPanel/LoadedModules/Caption": {
            "title": "$:/language/ControlPanel/LoadedModules/Caption",
            "text": "Loaded Modules"
        },
        "$:/language/ControlPanel/LoadedModules/Hint": {
            "title": "$:/language/ControlPanel/LoadedModules/Hint",
            "text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
        },
        "$:/language/ControlPanel/Palette/Caption": {
            "title": "$:/language/ControlPanel/Palette/Caption",
            "text": "Palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
            "text": "clone"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
            "text": "It is recommended that you clone this shadow palette before editing it"
        },
        "$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
            "title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
            "text": "delete this entry from the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
            "title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
            "text": "Show color names that are not part of the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
            "text": "This shadow palette has been modified"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt",
            "text": "Editing"
        },
        "$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
            "text": "reset"
        },
        "$:/language/ControlPanel/Palette/HideEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
            "text": "hide editor"
        },
        "$:/language/ControlPanel/Palette/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Prompt",
            "text": "Current palette:"
        },
        "$:/language/ControlPanel/Palette/ShowEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
            "text": "show editor"
        },
        "$:/language/ControlPanel/Parsing/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Caption",
            "text": "Parsing"
        },
        "$:/language/ControlPanel/Parsing/Hint": {
            "title": "$:/language/ControlPanel/Parsing/Hint",
            "text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
        },
        "$:/language/ControlPanel/Parsing/Block/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Block/Caption",
            "text": "Block Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Inline/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Inline/Caption",
            "text": "Inline Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Pragma/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
            "text": "Pragma Parse Rules"
        },
        "$:/language/ControlPanel/Plugins/Add/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Add/Caption",
            "text": "Get more plugins"
        },
        "$:/language/ControlPanel/Plugins/Add/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Add/Hint",
            "text": "Install plugins from the official library"
        },
        "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
            "text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
        },
        "$:/language/ControlPanel/Plugins/AlsoRequires": {
            "title": "$:/language/ControlPanel/Plugins/AlsoRequires",
            "text": "Also requires:"
        },
        "$:/language/ControlPanel/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Disable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Caption",
            "text": "disable"
        },
        "$:/language/ControlPanel/Plugins/Disable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Hint",
            "text": "Disable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Disabled/Status": {
            "title": "$:/language/ControlPanel/Plugins/Disabled/Status",
            "text": "(disabled)"
        },
        "$:/language/ControlPanel/Plugins/Downgrade/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
            "text": "downgrade"
        },
        "$:/language/ControlPanel/Plugins/Empty/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Empty/Hint",
            "text": "None"
        },
        "$:/language/ControlPanel/Plugins/Enable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Caption",
            "text": "enable"
        },
        "$:/language/ControlPanel/Plugins/Enable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Hint",
            "text": "Enable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Install/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Install/Caption",
            "text": "install"
        },
        "$:/language/ControlPanel/Plugins/Installed/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Installed/Hint",
            "text": "Currently installed plugins:"
        },
        "$:/language/ControlPanel/Plugins/Languages/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Caption",
            "text": "Languages"
        },
        "$:/language/ControlPanel/Plugins/Languages/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Hint",
            "text": "Language pack plugins"
        },
        "$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
            "text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
        },
        "$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
            "text": "This plugin is not currently installed"
        },
        "$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
            "text": "open plugin library"
        },
        "$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
            "text": "close plugin library"
        },
        "$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
            "title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
            "text": "(requires reload)"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Reinstall/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
            "text": "reinstall"
        },
        "$:/language/ControlPanel/Plugins/Themes/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Caption",
            "text": "Themes"
        },
        "$:/language/ControlPanel/Plugins/Themes/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Hint",
            "text": "Theme plugins"
        },
        "$:/language/ControlPanel/Plugins/Update/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Update/Caption",
            "text": "update"
        },
        "$:/language/ControlPanel/Plugins/Updates/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Caption",
            "text": "Updates"
        },
        "$:/language/ControlPanel/Plugins/Updates/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Hint",
            "text": "Available updates to installed plugins"
        },
        "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
            "text": "Update <<update-count>> plugins"
        },
        "$:/language/ControlPanel/Plugins/SubPluginPrompt": {
            "title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
            "text": "With <<count>> sub-plugins available"
        },
        "$:/language/ControlPanel/Saving/Caption": {
            "title": "$:/language/ControlPanel/Saving/Caption",
            "text": "Saving"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
            "text": "Permit automatic saving for the download saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
            "text": "Enable Autosave for Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
            "text": "Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
            "text": "These settings apply to the HTML5-compatible download saver"
        },
        "$:/language/ControlPanel/Saving/General/Caption": {
            "title": "$:/language/ControlPanel/Saving/General/Caption",
            "text": "General"
        },
        "$:/language/ControlPanel/Saving/General/Hint": {
            "title": "$:/language/ControlPanel/Saving/General/Hint",
            "text": "These settings apply to all the loaded savers"
        },
        "$:/language/ControlPanel/Saving/Hint": {
            "title": "$:/language/ControlPanel/Saving/Hint",
            "text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
        },
        "$:/language/ControlPanel/Saving/GitService/Branch": {
            "title": "$:/language/ControlPanel/Saving/GitService/Branch",
            "text": "Target branch for saving"
        },
        "$:/language/ControlPanel/Saving/GitService/CommitMessage": {
            "title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
            "text": "Saved by TiddlyWiki"
        },
        "$:/language/ControlPanel/Saving/GitService/Description": {
            "title": "$:/language/ControlPanel/Saving/GitService/Description",
            "text": "These settings are only used when saving to <<service-name>>"
        },
        "$:/language/ControlPanel/Saving/GitService/Filename": {
            "title": "$:/language/ControlPanel/Saving/GitService/Filename",
            "text": "Filename of target file (e.g. `index.html`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Path": {
            "title": "$:/language/ControlPanel/Saving/GitService/Path",
            "text": "Path to target file (e.g. `/wiki/`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Repo": {
            "title": "$:/language/ControlPanel/Saving/GitService/Repo",
            "text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
        },
        "$:/language/ControlPanel/Saving/GitService/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
            "text": "Server API URL"
        },
        "$:/language/ControlPanel/Saving/GitService/UserName": {
            "title": "$:/language/ControlPanel/Saving/GitService/UserName",
            "text": "Username"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
            "text": "~GitHub Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
            "text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
            "text": "~GitLab Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
            "text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
            "text": "Gitea Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
            "text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
            "text": "Advanced Settings"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
            "text": "Backup Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel",
            "text": "~TiddlySpot Control Panel"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
            "text": "Backups"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
            "text": "~TiddlySpot Saver"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Description": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
            "text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
            "text": "Upload Filename"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
            "text": "~TiddlySpot"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
            "text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Password": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
            "text": "Password"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly",
            "text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers."
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
            "text": "Server URL"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
            "text": "Upload Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
            "text": "Wiki Name"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Caption": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
            "text": "Autosave"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
            "text": "Do not save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
            "text": "Save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
            "text": "Attempt to automatically save changes during editing when using a supporting saver"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Caption": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
            "text": "Camel Case Wiki Links"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Hint": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
            "text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Description": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Description",
            "text": "Enable automatic ~CamelCase linking"
        },
        "$:/language/ControlPanel/Settings/Caption": {
            "title": "$:/language/ControlPanel/Settings/Caption",
            "text": "Settings"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
            "text": "Enable or disable the editor toolbar:"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Description": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
            "text": "Show editor toolbar"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
            "text": "Tiddler Info Panel Mode"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
            "text": "Control when the tiddler info panel closes:"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
            "text": "Tiddler info panel closes automatically"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
            "text": "Tiddler info panel stays open until explicitly closed"
        },
        "$:/language/ControlPanel/Settings/Hint": {
            "title": "$:/language/ControlPanel/Settings/Hint",
            "text": "These settings let you customise the behaviour of TiddlyWiki."
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
            "text": "Navigation Address Bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
            "text": "Behaviour of the browser address bar when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
            "text": "Do not update the address bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
            "text": "Include the target tiddler"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
            "text": "Include the target tiddler and the current story sequence"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
            "text": "Navigation History"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
            "text": "Update browser history when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
            "text": "Do not update history"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
            "text": "Update history"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
            "text": "Permalink/permaview Mode"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
            "text": "Choose how permalink/permaview is handled:"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
            "text": "Copy permalink/permaview URL to clipboard"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
            "text": "Update address bar with permalink/permaview URL"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
            "text": "Performance Instrumentation"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
            "text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
            "text": "Enable performance instrumentation"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
            "text": "Toolbar Button Style"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
            "text": "Choose the style for toolbar buttons:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
            "text": "Borderless"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
            "text": "Boxed"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
            "text": "Rounded"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
            "text": "Toolbar Buttons"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
            "text": "Default toolbar button appearance:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
            "text": "Include icon"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
            "text": "Include text"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
            "text": "Default Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
            "text": "Specify which sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
            "text": "Default More Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
            "text": "Specify which More sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
            "text": "Tiddler Opening Behaviour"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
            "text": "Navigation from //within// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
            "text": "Navigation from //outside// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
            "text": "Open above the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
            "text": "Open below the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
            "text": "Open at the top of the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
            "text": "Open at the bottom of the story river"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
            "text": "Tiddler Titles"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
            "text": "Optionally display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
            "text": "Do not display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
            "text": "Display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
            "text": "Wiki Links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
            "text": "Choose whether to link to tiddlers that do not exist yet"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Description": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
            "text": "Enable links to missing tiddlers"
        },
        "$:/language/ControlPanel/StoryView/Caption": {
            "title": "$:/language/ControlPanel/StoryView/Caption",
            "text": "Story View"
        },
        "$:/language/ControlPanel/StoryView/Prompt": {
            "title": "$:/language/ControlPanel/StoryView/Prompt",
            "text": "Current view:"
        },
        "$:/language/ControlPanel/Stylesheets/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Caption",
            "text": "Stylesheets"
        },
        "$:/language/ControlPanel/Stylesheets/Expand/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
            "text": "Expand All"
        },
        "$:/language/ControlPanel/Stylesheets/Hint": {
            "title": "$:/language/ControlPanel/Stylesheets/Hint",
            "text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
        },
        "$:/language/ControlPanel/Stylesheets/Restore/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
            "text": "Restore"
        },
        "$:/language/ControlPanel/Theme/Caption": {
            "title": "$:/language/ControlPanel/Theme/Caption",
            "text": "Theme"
        },
        "$:/language/ControlPanel/Theme/Prompt": {
            "title": "$:/language/ControlPanel/Theme/Prompt",
            "text": "Current theme:"
        },
        "$:/language/ControlPanel/TiddlerFields/Caption": {
            "title": "$:/language/ControlPanel/TiddlerFields/Caption",
            "text": "Tiddler Fields"
        },
        "$:/language/ControlPanel/TiddlerFields/Hint": {
            "title": "$:/language/ControlPanel/TiddlerFields/Hint",
            "text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
        },
        "$:/language/ControlPanel/Toolbars/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/Caption",
            "text": "Toolbars"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
            "text": "Edit Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/Hint",
            "text": "Select which toolbar buttons are displayed"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
            "text": "Page Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
            "text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
            "text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
            "text": "View Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Tools/Download/Full/Caption": {
            "title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
            "text": "Download full wiki"
        },
        "$:/language/Date/DaySuffix/1": {
            "title": "$:/language/Date/DaySuffix/1",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/2": {
            "title": "$:/language/Date/DaySuffix/2",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/3": {
            "title": "$:/language/Date/DaySuffix/3",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/4": {
            "title": "$:/language/Date/DaySuffix/4",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/5": {
            "title": "$:/language/Date/DaySuffix/5",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/6": {
            "title": "$:/language/Date/DaySuffix/6",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/7": {
            "title": "$:/language/Date/DaySuffix/7",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/8": {
            "title": "$:/language/Date/DaySuffix/8",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/9": {
            "title": "$:/language/Date/DaySuffix/9",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/10": {
            "title": "$:/language/Date/DaySuffix/10",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/11": {
            "title": "$:/language/Date/DaySuffix/11",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/12": {
            "title": "$:/language/Date/DaySuffix/12",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/13": {
            "title": "$:/language/Date/DaySuffix/13",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/14": {
            "title": "$:/language/Date/DaySuffix/14",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/15": {
            "title": "$:/language/Date/DaySuffix/15",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/16": {
            "title": "$:/language/Date/DaySuffix/16",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/17": {
            "title": "$:/language/Date/DaySuffix/17",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/18": {
            "title": "$:/language/Date/DaySuffix/18",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/19": {
            "title": "$:/language/Date/DaySuffix/19",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/20": {
            "title": "$:/language/Date/DaySuffix/20",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/21": {
            "title": "$:/language/Date/DaySuffix/21",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/22": {
            "title": "$:/language/Date/DaySuffix/22",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/23": {
            "title": "$:/language/Date/DaySuffix/23",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/24": {
            "title": "$:/language/Date/DaySuffix/24",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/25": {
            "title": "$:/language/Date/DaySuffix/25",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/26": {
            "title": "$:/language/Date/DaySuffix/26",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/27": {
            "title": "$:/language/Date/DaySuffix/27",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/28": {
            "title": "$:/language/Date/DaySuffix/28",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/29": {
            "title": "$:/language/Date/DaySuffix/29",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/30": {
            "title": "$:/language/Date/DaySuffix/30",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/31": {
            "title": "$:/language/Date/DaySuffix/31",
            "text": "st"
        },
        "$:/language/Date/Long/Day/0": {
            "title": "$:/language/Date/Long/Day/0",
            "text": "Sunday"
        },
        "$:/language/Date/Long/Day/1": {
            "title": "$:/language/Date/Long/Day/1",
            "text": "Monday"
        },
        "$:/language/Date/Long/Day/2": {
            "title": "$:/language/Date/Long/Day/2",
            "text": "Tuesday"
        },
        "$:/language/Date/Long/Day/3": {
            "title": "$:/language/Date/Long/Day/3",
            "text": "Wednesday"
        },
        "$:/language/Date/Long/Day/4": {
            "title": "$:/language/Date/Long/Day/4",
            "text": "Thursday"
        },
        "$:/language/Date/Long/Day/5": {
            "title": "$:/language/Date/Long/Day/5",
            "text": "Friday"
        },
        "$:/language/Date/Long/Day/6": {
            "title": "$:/language/Date/Long/Day/6",
            "text": "Saturday"
        },
        "$:/language/Date/Long/Month/1": {
            "title": "$:/language/Date/Long/Month/1",
            "text": "January"
        },
        "$:/language/Date/Long/Month/2": {
            "title": "$:/language/Date/Long/Month/2",
            "text": "February"
        },
        "$:/language/Date/Long/Month/3": {
            "title": "$:/language/Date/Long/Month/3",
            "text": "March"
        },
        "$:/language/Date/Long/Month/4": {
            "title": "$:/language/Date/Long/Month/4",
            "text": "April"
        },
        "$:/language/Date/Long/Month/5": {
            "title": "$:/language/Date/Long/Month/5",
            "text": "May"
        },
        "$:/language/Date/Long/Month/6": {
            "title": "$:/language/Date/Long/Month/6",
            "text": "June"
        },
        "$:/language/Date/Long/Month/7": {
            "title": "$:/language/Date/Long/Month/7",
            "text": "July"
        },
        "$:/language/Date/Long/Month/8": {
            "title": "$:/language/Date/Long/Month/8",
            "text": "August"
        },
        "$:/language/Date/Long/Month/9": {
            "title": "$:/language/Date/Long/Month/9",
            "text": "September"
        },
        "$:/language/Date/Long/Month/10": {
            "title": "$:/language/Date/Long/Month/10",
            "text": "October"
        },
        "$:/language/Date/Long/Month/11": {
            "title": "$:/language/Date/Long/Month/11",
            "text": "November"
        },
        "$:/language/Date/Long/Month/12": {
            "title": "$:/language/Date/Long/Month/12",
            "text": "December"
        },
        "$:/language/Date/Period/am": {
            "title": "$:/language/Date/Period/am",
            "text": "am"
        },
        "$:/language/Date/Period/pm": {
            "title": "$:/language/Date/Period/pm",
            "text": "pm"
        },
        "$:/language/Date/Short/Day/0": {
            "title": "$:/language/Date/Short/Day/0",
            "text": "Sun"
        },
        "$:/language/Date/Short/Day/1": {
            "title": "$:/language/Date/Short/Day/1",
            "text": "Mon"
        },
        "$:/language/Date/Short/Day/2": {
            "title": "$:/language/Date/Short/Day/2",
            "text": "Tue"
        },
        "$:/language/Date/Short/Day/3": {
            "title": "$:/language/Date/Short/Day/3",
            "text": "Wed"
        },
        "$:/language/Date/Short/Day/4": {
            "title": "$:/language/Date/Short/Day/4",
            "text": "Thu"
        },
        "$:/language/Date/Short/Day/5": {
            "title": "$:/language/Date/Short/Day/5",
            "text": "Fri"
        },
        "$:/language/Date/Short/Day/6": {
            "title": "$:/language/Date/Short/Day/6",
            "text": "Sat"
        },
        "$:/language/Date/Short/Month/1": {
            "title": "$:/language/Date/Short/Month/1",
            "text": "Jan"
        },
        "$:/language/Date/Short/Month/2": {
            "title": "$:/language/Date/Short/Month/2",
            "text": "Feb"
        },
        "$:/language/Date/Short/Month/3": {
            "title": "$:/language/Date/Short/Month/3",
            "text": "Mar"
        },
        "$:/language/Date/Short/Month/4": {
            "title": "$:/language/Date/Short/Month/4",
            "text": "Apr"
        },
        "$:/language/Date/Short/Month/5": {
            "title": "$:/language/Date/Short/Month/5",
            "text": "May"
        },
        "$:/language/Date/Short/Month/6": {
            "title": "$:/language/Date/Short/Month/6",
            "text": "Jun"
        },
        "$:/language/Date/Short/Month/7": {
            "title": "$:/language/Date/Short/Month/7",
            "text": "Jul"
        },
        "$:/language/Date/Short/Month/8": {
            "title": "$:/language/Date/Short/Month/8",
            "text": "Aug"
        },
        "$:/language/Date/Short/Month/9": {
            "title": "$:/language/Date/Short/Month/9",
            "text": "Sep"
        },
        "$:/language/Date/Short/Month/10": {
            "title": "$:/language/Date/Short/Month/10",
            "text": "Oct"
        },
        "$:/language/Date/Short/Month/11": {
            "title": "$:/language/Date/Short/Month/11",
            "text": "Nov"
        },
        "$:/language/Date/Short/Month/12": {
            "title": "$:/language/Date/Short/Month/12",
            "text": "Dec"
        },
        "$:/language/RelativeDate/Future/Days": {
            "title": "$:/language/RelativeDate/Future/Days",
            "text": "<<period>> days from now"
        },
        "$:/language/RelativeDate/Future/Hours": {
            "title": "$:/language/RelativeDate/Future/Hours",
            "text": "<<period>> hours from now"
        },
        "$:/language/RelativeDate/Future/Minutes": {
            "title": "$:/language/RelativeDate/Future/Minutes",
            "text": "<<period>> minutes from now"
        },
        "$:/language/RelativeDate/Future/Months": {
            "title": "$:/language/RelativeDate/Future/Months",
            "text": "<<period>> months from now"
        },
        "$:/language/RelativeDate/Future/Second": {
            "title": "$:/language/RelativeDate/Future/Second",
            "text": "1 second from now"
        },
        "$:/language/RelativeDate/Future/Seconds": {
            "title": "$:/language/RelativeDate/Future/Seconds",
            "text": "<<period>> seconds from now"
        },
        "$:/language/RelativeDate/Future/Years": {
            "title": "$:/language/RelativeDate/Future/Years",
            "text": "<<period>> years from now"
        },
        "$:/language/RelativeDate/Past/Days": {
            "title": "$:/language/RelativeDate/Past/Days",
            "text": "<<period>> days ago"
        },
        "$:/language/RelativeDate/Past/Hours": {
            "title": "$:/language/RelativeDate/Past/Hours",
            "text": "<<period>> hours ago"
        },
        "$:/language/RelativeDate/Past/Minutes": {
            "title": "$:/language/RelativeDate/Past/Minutes",
            "text": "<<period>> minutes ago"
        },
        "$:/language/RelativeDate/Past/Months": {
            "title": "$:/language/RelativeDate/Past/Months",
            "text": "<<period>> months ago"
        },
        "$:/language/RelativeDate/Past/Second": {
            "title": "$:/language/RelativeDate/Past/Second",
            "text": "1 second ago"
        },
        "$:/language/RelativeDate/Past/Seconds": {
            "title": "$:/language/RelativeDate/Past/Seconds",
            "text": "<<period>> seconds ago"
        },
        "$:/language/RelativeDate/Past/Years": {
            "title": "$:/language/RelativeDate/Past/Years",
            "text": "<<period>> years ago"
        },
        "$:/language/Docs/ModuleTypes/allfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/allfilteroperator",
            "text": "A sub-operator for the ''all'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/animation": {
            "title": "$:/language/Docs/ModuleTypes/animation",
            "text": "Animations that may be used with the RevealWidget."
        },
        "$:/language/Docs/ModuleTypes/authenticator": {
            "title": "$:/language/Docs/ModuleTypes/authenticator",
            "text": "Defines how requests are authenticated by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
            "text": "A bitmap editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/command": {
            "title": "$:/language/Docs/ModuleTypes/command",
            "text": "Commands that can be executed under Node.js."
        },
        "$:/language/Docs/ModuleTypes/config": {
            "title": "$:/language/Docs/ModuleTypes/config",
            "text": "Data to be inserted into `$tw.config`."
        },
        "$:/language/Docs/ModuleTypes/filteroperator": {
            "title": "$:/language/Docs/ModuleTypes/filteroperator",
            "text": "Individual filter operator methods."
        },
        "$:/language/Docs/ModuleTypes/global": {
            "title": "$:/language/Docs/ModuleTypes/global",
            "text": "Global data to be inserted into `$tw`."
        },
        "$:/language/Docs/ModuleTypes/info": {
            "title": "$:/language/Docs/ModuleTypes/info",
            "text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
        },
        "$:/language/Docs/ModuleTypes/isfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/isfilteroperator",
            "text": "Operands for the ''is'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/library": {
            "title": "$:/language/Docs/ModuleTypes/library",
            "text": "Generic module type for general purpose JavaScript modules."
        },
        "$:/language/Docs/ModuleTypes/macro": {
            "title": "$:/language/Docs/ModuleTypes/macro",
            "text": "JavaScript macro definitions."
        },
        "$:/language/Docs/ModuleTypes/parser": {
            "title": "$:/language/Docs/ModuleTypes/parser",
            "text": "Parsers for different content types."
        },
        "$:/language/Docs/ModuleTypes/route": {
            "title": "$:/language/Docs/ModuleTypes/route",
            "text": "Defines how individual URL patterns are handled by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/saver": {
            "title": "$:/language/Docs/ModuleTypes/saver",
            "text": "Savers handle different methods for saving files from the browser."
        },
        "$:/language/Docs/ModuleTypes/startup": {
            "title": "$:/language/Docs/ModuleTypes/startup",
            "text": "Startup functions."
        },
        "$:/language/Docs/ModuleTypes/storyview": {
            "title": "$:/language/Docs/ModuleTypes/storyview",
            "text": "Story views customise the animation and behaviour of list widgets."
        },
        "$:/language/Docs/ModuleTypes/texteditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/texteditoroperation",
            "text": "A text editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
            "text": "Converts different content types into tiddlers."
        },
        "$:/language/Docs/ModuleTypes/tiddlerfield": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerfield",
            "text": "Defines the behaviour of an individual tiddler field."
        },
        "$:/language/Docs/ModuleTypes/tiddlermethod": {
            "title": "$:/language/Docs/ModuleTypes/tiddlermethod",
            "text": "Adds methods to the `$tw.Tiddler` prototype."
        },
        "$:/language/Docs/ModuleTypes/upgrader": {
            "title": "$:/language/Docs/ModuleTypes/upgrader",
            "text": "Applies upgrade processing to tiddlers during an upgrade/import."
        },
        "$:/language/Docs/ModuleTypes/utils": {
            "title": "$:/language/Docs/ModuleTypes/utils",
            "text": "Adds methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/utils-node": {
            "title": "$:/language/Docs/ModuleTypes/utils-node",
            "text": "Adds Node.js-specific methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/widget": {
            "title": "$:/language/Docs/ModuleTypes/widget",
            "text": "Widgets encapsulate DOM rendering and refreshing."
        },
        "$:/language/Docs/ModuleTypes/wikimethod": {
            "title": "$:/language/Docs/ModuleTypes/wikimethod",
            "text": "Adds methods to `$tw.Wiki`."
        },
        "$:/language/Docs/ModuleTypes/wikirule": {
            "title": "$:/language/Docs/ModuleTypes/wikirule",
            "text": "Individual parser rules for the main WikiText parser."
        },
        "$:/language/Docs/PaletteColours/alert-background": {
            "title": "$:/language/Docs/PaletteColours/alert-background",
            "text": "Alert background"
        },
        "$:/language/Docs/PaletteColours/alert-border": {
            "title": "$:/language/Docs/PaletteColours/alert-border",
            "text": "Alert border"
        },
        "$:/language/Docs/PaletteColours/alert-highlight": {
            "title": "$:/language/Docs/PaletteColours/alert-highlight",
            "text": "Alert highlight"
        },
        "$:/language/Docs/PaletteColours/alert-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
            "text": "Alert muted foreground"
        },
        "$:/language/Docs/PaletteColours/background": {
            "title": "$:/language/Docs/PaletteColours/background",
            "text": "General background"
        },
        "$:/language/Docs/PaletteColours/blockquote-bar": {
            "title": "$:/language/Docs/PaletteColours/blockquote-bar",
            "text": "Blockquote bar"
        },
        "$:/language/Docs/PaletteColours/button-background": {
            "title": "$:/language/Docs/PaletteColours/button-background",
            "text": "Default button background"
        },
        "$:/language/Docs/PaletteColours/button-border": {
            "title": "$:/language/Docs/PaletteColours/button-border",
            "text": "Default button border"
        },
        "$:/language/Docs/PaletteColours/button-foreground": {
            "title": "$:/language/Docs/PaletteColours/button-foreground",
            "text": "Default button foreground"
        },
        "$:/language/Docs/PaletteColours/dirty-indicator": {
            "title": "$:/language/Docs/PaletteColours/dirty-indicator",
            "text": "Unsaved changes indicator"
        },
        "$:/language/Docs/PaletteColours/code-background": {
            "title": "$:/language/Docs/PaletteColours/code-background",
            "text": "Code background"
        },
        "$:/language/Docs/PaletteColours/code-border": {
            "title": "$:/language/Docs/PaletteColours/code-border",
            "text": "Code border"
        },
        "$:/language/Docs/PaletteColours/code-foreground": {
            "title": "$:/language/Docs/PaletteColours/code-foreground",
            "text": "Code foreground"
        },
        "$:/language/Docs/PaletteColours/download-background": {
            "title": "$:/language/Docs/PaletteColours/download-background",
            "text": "Download button background"
        },
        "$:/language/Docs/PaletteColours/download-foreground": {
            "title": "$:/language/Docs/PaletteColours/download-foreground",
            "text": "Download button foreground"
        },
        "$:/language/Docs/PaletteColours/dragger-background": {
            "title": "$:/language/Docs/PaletteColours/dragger-background",
            "text": "Dragger background"
        },
        "$:/language/Docs/PaletteColours/dragger-foreground": {
            "title": "$:/language/Docs/PaletteColours/dragger-foreground",
            "text": "Dragger foreground"
        },
        "$:/language/Docs/PaletteColours/dropdown-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-background",
            "text": "Dropdown background"
        },
        "$:/language/Docs/PaletteColours/dropdown-border": {
            "title": "$:/language/Docs/PaletteColours/dropdown-border",
            "text": "Dropdown border"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
            "text": "Dropdown tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
            "text": "Dropdown tab background"
        },
        "$:/language/Docs/PaletteColours/dropzone-background": {
            "title": "$:/language/Docs/PaletteColours/dropzone-background",
            "text": "Dropzone background"
        },
        "$:/language/Docs/PaletteColours/external-link-background-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-hover",
            "text": "External link background hover"
        },
        "$:/language/Docs/PaletteColours/external-link-background-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-visited",
            "text": "External link background visited"
        },
        "$:/language/Docs/PaletteColours/external-link-background": {
            "title": "$:/language/Docs/PaletteColours/external-link-background",
            "text": "External link background"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
            "text": "External link foreground hover"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
            "text": "External link foreground visited"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground",
            "text": "External link foreground"
        },
        "$:/language/Docs/PaletteColours/foreground": {
            "title": "$:/language/Docs/PaletteColours/foreground",
            "text": "General foreground"
        },
        "$:/language/Docs/PaletteColours/menubar-background": {
            "title": "$:/language/Docs/PaletteColours/menubar-background",
            "text": "Menu bar background"
        },
        "$:/language/Docs/PaletteColours/menubar-foreground": {
            "title": "$:/language/Docs/PaletteColours/menubar-foreground",
            "text": "Menu bar foreground"
        },
        "$:/language/Docs/PaletteColours/message-background": {
            "title": "$:/language/Docs/PaletteColours/message-background",
            "text": "Message box background"
        },
        "$:/language/Docs/PaletteColours/message-border": {
            "title": "$:/language/Docs/PaletteColours/message-border",
            "text": "Message box border"
        },
        "$:/language/Docs/PaletteColours/message-foreground": {
            "title": "$:/language/Docs/PaletteColours/message-foreground",
            "text": "Message box foreground"
        },
        "$:/language/Docs/PaletteColours/modal-backdrop": {
            "title": "$:/language/Docs/PaletteColours/modal-backdrop",
            "text": "Modal backdrop"
        },
        "$:/language/Docs/PaletteColours/modal-background": {
            "title": "$:/language/Docs/PaletteColours/modal-background",
            "text": "Modal background"
        },
        "$:/language/Docs/PaletteColours/modal-border": {
            "title": "$:/language/Docs/PaletteColours/modal-border",
            "text": "Modal border"
        },
        "$:/language/Docs/PaletteColours/modal-footer-background": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-background",
            "text": "Modal footer background"
        },
        "$:/language/Docs/PaletteColours/modal-footer-border": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-border",
            "text": "Modal footer border"
        },
        "$:/language/Docs/PaletteColours/modal-header-border": {
            "title": "$:/language/Docs/PaletteColours/modal-header-border",
            "text": "Modal header border"
        },
        "$:/language/Docs/PaletteColours/muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/muted-foreground",
            "text": "General muted foreground"
        },
        "$:/language/Docs/PaletteColours/notification-background": {
            "title": "$:/language/Docs/PaletteColours/notification-background",
            "text": "Notification background"
        },
        "$:/language/Docs/PaletteColours/notification-border": {
            "title": "$:/language/Docs/PaletteColours/notification-border",
            "text": "Notification border"
        },
        "$:/language/Docs/PaletteColours/page-background": {
            "title": "$:/language/Docs/PaletteColours/page-background",
            "text": "Page background"
        },
        "$:/language/Docs/PaletteColours/pre-background": {
            "title": "$:/language/Docs/PaletteColours/pre-background",
            "text": "Preformatted code background"
        },
        "$:/language/Docs/PaletteColours/pre-border": {
            "title": "$:/language/Docs/PaletteColours/pre-border",
            "text": "Preformatted code border"
        },
        "$:/language/Docs/PaletteColours/primary": {
            "title": "$:/language/Docs/PaletteColours/primary",
            "text": "General primary"
        },
        "$:/language/Docs/PaletteColours/select-tag-background": {
            "title": "$:/language/Docs/PaletteColours/select-tag-background",
            "text": "`<select>` element background"
        },
        "$:/language/Docs/PaletteColours/select-tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/select-tag-foreground",
            "text": "`<select>` element text"
        },
        "$:/language/Docs/PaletteColours/sidebar-button-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
            "text": "Sidebar button foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
            "text": "Sidebar controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
            "text": "Sidebar controls foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
            "text": "Sidebar foreground shadow"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground",
            "text": "Sidebar foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
            "text": "Sidebar muted foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
            "text": "Sidebar muted foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
            "text": "Sidebar tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
            "text": "Sidebar tab background"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
            "text": "Sidebar tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
            "text": "Sidebar tab border"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-divider": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
            "text": "Sidebar tab divider"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
            "text": "Sidebar tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
            "text": "Sidebar tab foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
            "text": "Sidebar tiddler link foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
            "text": "Sidebar tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/site-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/site-title-foreground",
            "text": "Site title foreground"
        },
        "$:/language/Docs/PaletteColours/static-alert-foreground": {
            "title": "$:/language/Docs/PaletteColours/static-alert-foreground",
            "text": "Static alert foreground"
        },
        "$:/language/Docs/PaletteColours/tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-background-selected",
            "text": "Tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-background": {
            "title": "$:/language/Docs/PaletteColours/tab-background",
            "text": "Tab background"
        },
        "$:/language/Docs/PaletteColours/tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-border-selected",
            "text": "Tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-border": {
            "title": "$:/language/Docs/PaletteColours/tab-border",
            "text": "Tab border"
        },
        "$:/language/Docs/PaletteColours/tab-divider": {
            "title": "$:/language/Docs/PaletteColours/tab-divider",
            "text": "Tab divider"
        },
        "$:/language/Docs/PaletteColours/tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
            "text": "Tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground",
            "text": "Tab foreground"
        },
        "$:/language/Docs/PaletteColours/table-border": {
            "title": "$:/language/Docs/PaletteColours/table-border",
            "text": "Table border"
        },
        "$:/language/Docs/PaletteColours/table-footer-background": {
            "title": "$:/language/Docs/PaletteColours/table-footer-background",
            "text": "Table footer background"
        },
        "$:/language/Docs/PaletteColours/table-header-background": {
            "title": "$:/language/Docs/PaletteColours/table-header-background",
            "text": "Table header background"
        },
        "$:/language/Docs/PaletteColours/tag-background": {
            "title": "$:/language/Docs/PaletteColours/tag-background",
            "text": "Tag background"
        },
        "$:/language/Docs/PaletteColours/tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/tag-foreground",
            "text": "Tag foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-background",
            "text": "Tiddler background"
        },
        "$:/language/Docs/PaletteColours/tiddler-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-border",
            "text": "Tiddler border"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
            "text": "Tiddler controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
            "text": "Tiddler controls foreground for selected controls"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
            "text": "Tiddler controls foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
            "text": "Tiddler editor background"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
            "text": "Tiddler editor border image"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
            "text": "Tiddler editor border"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
            "text": "Tiddler editor background for even fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
            "text": "Tiddler editor background for odd fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-background",
            "text": "Tiddler info panel background"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-border",
            "text": "Tiddler info panel border"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
            "text": "Tiddler info panel tab background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-background",
            "text": "Tiddler link background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
            "text": "Tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
            "text": "Tiddler subtitle foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
            "text": "Tiddler title foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-new-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-new-button",
            "text": "Toolbar 'new tiddler' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-options-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-options-button",
            "text": "Toolbar 'options' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-save-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-save-button",
            "text": "Toolbar 'save' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-info-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-info-button",
            "text": "Toolbar 'info' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-edit-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
            "text": "Toolbar 'edit' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-close-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-close-button",
            "text": "Toolbar 'close' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-delete-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
            "text": "Toolbar 'delete' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-cancel-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
            "text": "Toolbar 'cancel' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-done-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-done-button",
            "text": "Toolbar 'done' button foreground"
        },
        "$:/language/Docs/PaletteColours/untagged-background": {
            "title": "$:/language/Docs/PaletteColours/untagged-background",
            "text": "Untagged pill background"
        },
        "$:/language/Docs/PaletteColours/very-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/very-muted-foreground",
            "text": "Very muted foreground"
        },
        "$:/language/EditTemplate/Body/External/Hint": {
            "title": "$:/language/EditTemplate/Body/External/Hint",
            "text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
        },
        "$:/language/EditTemplate/Body/Placeholder": {
            "title": "$:/language/EditTemplate/Body/Placeholder",
            "text": "Type the text for this tiddler"
        },
        "$:/language/EditTemplate/Body/Preview/Type/Output": {
            "title": "$:/language/EditTemplate/Body/Preview/Type/Output",
            "text": "output"
        },
        "$:/language/EditTemplate/Field/Remove/Caption": {
            "title": "$:/language/EditTemplate/Field/Remove/Caption",
            "text": "remove field"
        },
        "$:/language/EditTemplate/Field/Remove/Hint": {
            "title": "$:/language/EditTemplate/Field/Remove/Hint",
            "text": "Remove field"
        },
        "$:/language/EditTemplate/Field/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Caption",
            "text": "field list"
        },
        "$:/language/EditTemplate/Field/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Hint",
            "text": "Show field list"
        },
        "$:/language/EditTemplate/Fields/Add/Button": {
            "title": "$:/language/EditTemplate/Fields/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Fields/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
            "text": "Add the new field to the tiddler"
        },
        "$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
            "text": "field name"
        },
        "$:/language/EditTemplate/Fields/Add/Prompt": {
            "title": "$:/language/EditTemplate/Fields/Add/Prompt",
            "text": "Add a new field:"
        },
        "$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
            "text": "field value"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/System": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
            "text": "System fields"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/User": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
            "text": "User fields"
        },
        "$:/language/EditTemplate/Shadow/Warning": {
            "title": "$:/language/EditTemplate/Shadow/Warning",
            "text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
        },
        "$:/language/EditTemplate/Shadow/OverriddenWarning": {
            "title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
            "text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
        },
        "$:/language/EditTemplate/Tags/Add/Button": {
            "title": "$:/language/EditTemplate/Tags/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Tags/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
            "text": "add tag"
        },
        "$:/language/EditTemplate/Tags/Add/Placeholder": {
            "title": "$:/language/EditTemplate/Tags/Add/Placeholder",
            "text": "tag name"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Caption": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Caption",
            "text": "clear input"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Hint": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Hint",
            "text": "Clear tag input"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
            "text": "tag list"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
            "text": "Show tag list"
        },
        "$:/language/EditTemplate/Title/BadCharacterWarning": {
            "title": "$:/language/EditTemplate/Title/BadCharacterWarning",
            "text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
        },
        "$:/language/EditTemplate/Title/Exists/Prompt": {
            "title": "$:/language/EditTemplate/Title/Exists/Prompt",
            "text": "Target tiddler already exists"
        },
        "$:/language/EditTemplate/Title/Relink/Prompt": {
            "title": "$:/language/EditTemplate/Title/Relink/Prompt",
            "text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
        },
        "$:/language/EditTemplate/Title/References/Prompt": {
            "title": "$:/language/EditTemplate/Title/References/Prompt",
            "text": "The following references to this tiddler will not be automatically updated:"
        },
        "$:/language/EditTemplate/Type/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Caption",
            "text": "content type list"
        },
        "$:/language/EditTemplate/Type/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Hint",
            "text": "Show content type list"
        },
        "$:/language/EditTemplate/Type/Delete/Caption": {
            "title": "$:/language/EditTemplate/Type/Delete/Caption",
            "text": "delete content type"
        },
        "$:/language/EditTemplate/Type/Delete/Hint": {
            "title": "$:/language/EditTemplate/Type/Delete/Hint",
            "text": "Delete content type"
        },
        "$:/language/EditTemplate/Type/Placeholder": {
            "title": "$:/language/EditTemplate/Type/Placeholder",
            "text": "content type"
        },
        "$:/language/EditTemplate/Type/Prompt": {
            "title": "$:/language/EditTemplate/Type/Prompt",
            "text": "Type:"
        },
        "$:/language/Exporters/StaticRiver": {
            "title": "$:/language/Exporters/StaticRiver",
            "text": "Static HTML"
        },
        "$:/language/Exporters/JsonFile": {
            "title": "$:/language/Exporters/JsonFile",
            "text": "JSON file"
        },
        "$:/language/Exporters/CsvFile": {
            "title": "$:/language/Exporters/CsvFile",
            "text": "CSV file"
        },
        "$:/language/Exporters/TidFile": {
            "title": "$:/language/Exporters/TidFile",
            "text": "\".tid\" file"
        },
        "$:/language/Docs/Fields/_canonical_uri": {
            "title": "$:/language/Docs/Fields/_canonical_uri",
            "text": "The full URI of an external image tiddler"
        },
        "$:/language/Docs/Fields/bag": {
            "title": "$:/language/Docs/Fields/bag",
            "text": "The name of the bag from which a tiddler came"
        },
        "$:/language/Docs/Fields/caption": {
            "title": "$:/language/Docs/Fields/caption",
            "text": "The text to be displayed on a tab or button"
        },
        "$:/language/Docs/Fields/color": {
            "title": "$:/language/Docs/Fields/color",
            "text": "The CSS color value associated with a tiddler"
        },
        "$:/language/Docs/Fields/component": {
            "title": "$:/language/Docs/Fields/component",
            "text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
        },
        "$:/language/Docs/Fields/current-tiddler": {
            "title": "$:/language/Docs/Fields/current-tiddler",
            "text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
        },
        "$:/language/Docs/Fields/created": {
            "title": "$:/language/Docs/Fields/created",
            "text": "The date a tiddler was created"
        },
        "$:/language/Docs/Fields/creator": {
            "title": "$:/language/Docs/Fields/creator",
            "text": "The name of the person who created a tiddler"
        },
        "$:/language/Docs/Fields/dependents": {
            "title": "$:/language/Docs/Fields/dependents",
            "text": "For a plugin, lists the dependent plugin titles"
        },
        "$:/language/Docs/Fields/description": {
            "title": "$:/language/Docs/Fields/description",
            "text": "The descriptive text for a plugin, or a modal dialogue"
        },
        "$:/language/Docs/Fields/draft.of": {
            "title": "$:/language/Docs/Fields/draft.of",
            "text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
        },
        "$:/language/Docs/Fields/draft.title": {
            "title": "$:/language/Docs/Fields/draft.title",
            "text": "For draft tiddlers, contains the proposed new title of the tiddler"
        },
        "$:/language/Docs/Fields/footer": {
            "title": "$:/language/Docs/Fields/footer",
            "text": "The footer text for a wizard"
        },
        "$:/language/Docs/Fields/hide-body": {
            "title": "$:/language/Docs/Fields/hide-body",
            "text": "The view template will hide bodies of tiddlers if set to: ''yes''"
        },
        "$:/language/Docs/Fields/icon": {
            "title": "$:/language/Docs/Fields/icon",
            "text": "The title of the tiddler containing the icon associated with a tiddler"
        },
        "$:/language/Docs/Fields/library": {
            "title": "$:/language/Docs/Fields/library",
            "text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
        },
        "$:/language/Docs/Fields/list": {
            "title": "$:/language/Docs/Fields/list",
            "text": "An ordered list of tiddler titles associated with a tiddler"
        },
        "$:/language/Docs/Fields/list-before": {
            "title": "$:/language/Docs/Fields/list-before",
            "text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/list-after": {
            "title": "$:/language/Docs/Fields/list-after",
            "text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/modified": {
            "title": "$:/language/Docs/Fields/modified",
            "text": "The date and time at which a tiddler was last modified"
        },
        "$:/language/Docs/Fields/modifier": {
            "title": "$:/language/Docs/Fields/modifier",
            "text": "The tiddler title associated with the person who last modified a tiddler"
        },
        "$:/language/Docs/Fields/name": {
            "title": "$:/language/Docs/Fields/name",
            "text": "The human readable name associated with a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-priority": {
            "title": "$:/language/Docs/Fields/plugin-priority",
            "text": "A numerical value indicating the priority of a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-type": {
            "title": "$:/language/Docs/Fields/plugin-type",
            "text": "The type of plugin in a plugin tiddler"
        },
        "$:/language/Docs/Fields/revision": {
            "title": "$:/language/Docs/Fields/revision",
            "text": "The revision of the tiddler held at the server"
        },
        "$:/language/Docs/Fields/released": {
            "title": "$:/language/Docs/Fields/released",
            "text": "Date of a TiddlyWiki release"
        },
        "$:/language/Docs/Fields/source": {
            "title": "$:/language/Docs/Fields/source",
            "text": "The source URL associated with a tiddler"
        },
        "$:/language/Docs/Fields/subtitle": {
            "title": "$:/language/Docs/Fields/subtitle",
            "text": "The subtitle text for a wizard"
        },
        "$:/language/Docs/Fields/tags": {
            "title": "$:/language/Docs/Fields/tags",
            "text": "A list of tags associated with a tiddler"
        },
        "$:/language/Docs/Fields/text": {
            "title": "$:/language/Docs/Fields/text",
            "text": "The body text of a tiddler"
        },
        "$:/language/Docs/Fields/throttle.refresh": {
            "title": "$:/language/Docs/Fields/throttle.refresh",
            "text": "If present, throttles refreshes of this tiddler"
        },
        "$:/language/Docs/Fields/title": {
            "title": "$:/language/Docs/Fields/title",
            "text": "The unique name of a tiddler"
        },
        "$:/language/Docs/Fields/toc-link": {
            "title": "$:/language/Docs/Fields/toc-link",
            "text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
        },
        "$:/language/Docs/Fields/type": {
            "title": "$:/language/Docs/Fields/type",
            "text": "The content type of a tiddler"
        },
        "$:/language/Docs/Fields/version": {
            "title": "$:/language/Docs/Fields/version",
            "text": "Version information for a plugin"
        },
        "$:/language/Docs/Fields/_is_skinny": {
            "title": "$:/language/Docs/Fields/_is_skinny",
            "text": "If present, indicates that the tiddler text field must be loaded from the server"
        },
        "$:/language/Filters/AllTiddlers": {
            "title": "$:/language/Filters/AllTiddlers",
            "text": "All tiddlers except system tiddlers"
        },
        "$:/language/Filters/RecentSystemTiddlers": {
            "title": "$:/language/Filters/RecentSystemTiddlers",
            "text": "Recently modified tiddlers, including system tiddlers"
        },
        "$:/language/Filters/RecentTiddlers": {
            "title": "$:/language/Filters/RecentTiddlers",
            "text": "Recently modified tiddlers"
        },
        "$:/language/Filters/AllTags": {
            "title": "$:/language/Filters/AllTags",
            "text": "All tags except system tags"
        },
        "$:/language/Filters/Missing": {
            "title": "$:/language/Filters/Missing",
            "text": "Missing tiddlers"
        },
        "$:/language/Filters/Drafts": {
            "title": "$:/language/Filters/Drafts",
            "text": "Draft tiddlers"
        },
        "$:/language/Filters/Orphans": {
            "title": "$:/language/Filters/Orphans",
            "text": "Orphan tiddlers"
        },
        "$:/language/Filters/SystemTiddlers": {
            "title": "$:/language/Filters/SystemTiddlers",
            "text": "System tiddlers"
        },
        "$:/language/Filters/ShadowTiddlers": {
            "title": "$:/language/Filters/ShadowTiddlers",
            "text": "Shadow tiddlers"
        },
        "$:/language/Filters/OverriddenShadowTiddlers": {
            "title": "$:/language/Filters/OverriddenShadowTiddlers",
            "text": "Overridden shadow tiddlers"
        },
        "$:/language/Filters/SessionTiddlers": {
            "title": "$:/language/Filters/SessionTiddlers",
            "text": "Tiddlers modified since the wiki was loaded"
        },
        "$:/language/Filters/SystemTags": {
            "title": "$:/language/Filters/SystemTags",
            "text": "System tags"
        },
        "$:/language/Filters/StoryList": {
            "title": "$:/language/Filters/StoryList",
            "text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
        },
        "$:/language/Filters/TypedTiddlers": {
            "title": "$:/language/Filters/TypedTiddlers",
            "text": "Non wiki-text tiddlers"
        },
        "GettingStarted": {
            "title": "GettingStarted",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
        },
        "$:/language/Help/build": {
            "title": "$:/language/Help/build",
            "description": "Automatically run configured commands",
            "text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
        },
        "$:/language/Help/clearpassword": {
            "title": "$:/language/Help/clearpassword",
            "description": "Clear a password for subsequent crypto operations",
            "text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
        },
        "$:/language/Help/default": {
            "title": "$:/language/Help/default",
            "text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
        },
        "$:/language/Help/deletetiddlers": {
            "title": "$:/language/Help/deletetiddlers",
            "description": "Deletes a group of tiddlers",
            "text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
        },
        "$:/language/Help/editions": {
            "title": "$:/language/Help/editions",
            "description": "Lists the available editions of TiddlyWiki",
            "text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
        },
        "$:/language/Help/fetch": {
            "title": "$:/language/Help/fetch",
            "description": "Fetch tiddlers from wiki by URL",
            "text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
        },
        "$:/language/Help/help": {
            "title": "$:/language/Help/help",
            "description": "Display help for TiddlyWiki commands",
            "text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
        },
        "$:/language/Help/import": {
            "title": "$:/language/Help/import",
            "description": "Import tiddlers from a file",
            "text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/init": {
            "title": "$:/language/Help/init",
            "description": "Initialise a new wiki folder",
            "text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
        },
        "$:/language/Help/listen": {
            "title": "$:/language/Help/listen",
            "description": "Provides an HTTP server interface to TiddlyWiki",
            "text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
        },
        "$:/language/Help/load": {
            "title": "$:/language/Help/load",
            "description": "Load tiddlers from a file",
            "text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/makelibrary": {
            "title": "$:/language/Help/makelibrary",
            "description": "Construct library plugin required by upgrade process",
            "text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
        },
        "$:/language/Help/notfound": {
            "title": "$:/language/Help/notfound",
            "text": "No such help item"
        },
        "$:/language/Help/output": {
            "title": "$:/language/Help/output",
            "description": "Set the base output directory for subsequent commands",
            "text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
        },
        "$:/language/Help/password": {
            "title": "$:/language/Help/password",
            "description": "Set a password for subsequent crypto operations",
            "text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
        },
        "$:/language/Help/render": {
            "title": "$:/language/Help/render",
            "description": "Renders individual tiddlers to files",
            "text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
        },
        "$:/language/Help/rendertiddler": {
            "title": "$:/language/Help/rendertiddler",
            "description": "Render an individual tiddler as a specified ContentType",
            "text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
        },
        "$:/language/Help/rendertiddlers": {
            "title": "$:/language/Help/rendertiddlers",
            "description": "Render tiddlers matching a filter to a specified ContentType",
            "text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
        },
        "$:/language/Help/save": {
            "title": "$:/language/Help/save",
            "description": "Saves individual raw tiddlers to files",
            "text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
        },
        "$:/language/Help/savetiddler": {
            "title": "$:/language/Help/savetiddler",
            "description": "Saves a raw tiddler to a file",
            "text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
        },
        "$:/language/Help/savetiddlers": {
            "title": "$:/language/Help/savetiddlers",
            "description": "Saves a group of raw tiddlers to a directory",
            "text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
        },
        "$:/language/Help/savewikifolder": {
            "title": "$:/language/Help/savewikifolder",
            "description": "Saves a wiki to a new wiki folder",
            "text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
        },
        "$:/language/Help/server": {
            "title": "$:/language/Help/server",
            "description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
            "text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
        },
        "$:/language/Help/setfield": {
            "title": "$:/language/Help/setfield",
            "description": "Prepares external tiddlers for use",
            "text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
        },
        "$:/language/Help/unpackplugin": {
            "title": "$:/language/Help/unpackplugin",
            "description": "Unpack the payload tiddlers from a plugin",
            "text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
        },
        "$:/language/Help/verbose": {
            "title": "$:/language/Help/verbose",
            "description": "Triggers verbose output mode",
            "text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
        },
        "$:/language/Help/version": {
            "title": "$:/language/Help/version",
            "description": "Displays the version number of TiddlyWiki",
            "text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
        },
        "$:/language/Import/Imported/Hint": {
            "title": "$:/language/Import/Imported/Hint",
            "text": "The following tiddlers were imported:"
        },
        "$:/language/Import/Listing/Cancel/Caption": {
            "title": "$:/language/Import/Listing/Cancel/Caption",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Hint": {
            "title": "$:/language/Import/Listing/Hint",
            "text": "These tiddlers are ready to import:"
        },
        "$:/language/Import/Listing/Import/Caption": {
            "title": "$:/language/Import/Listing/Import/Caption",
            "text": "Import"
        },
        "$:/language/Import/Listing/Select/Caption": {
            "title": "$:/language/Import/Listing/Select/Caption",
            "text": "Select"
        },
        "$:/language/Import/Listing/Status/Caption": {
            "title": "$:/language/Import/Listing/Status/Caption",
            "text": "Status"
        },
        "$:/language/Import/Listing/Title/Caption": {
            "title": "$:/language/Import/Listing/Title/Caption",
            "text": "Title"
        },
        "$:/language/Import/Listing/Preview": {
            "title": "$:/language/Import/Listing/Preview",
            "text": "Preview:"
        },
        "$:/language/Import/Listing/Preview/Text": {
            "title": "$:/language/Import/Listing/Preview/Text",
            "text": "Text"
        },
        "$:/language/Import/Listing/Preview/TextRaw": {
            "title": "$:/language/Import/Listing/Preview/TextRaw",
            "text": "Text (Raw)"
        },
        "$:/language/Import/Listing/Preview/Fields": {
            "title": "$:/language/Import/Listing/Preview/Fields",
            "text": "Fields"
        },
        "$:/language/Import/Listing/Preview/Diff": {
            "title": "$:/language/Import/Listing/Preview/Diff",
            "text": "Diff"
        },
        "$:/language/Import/Listing/Preview/DiffFields": {
            "title": "$:/language/Import/Listing/Preview/DiffFields",
            "text": "Diff (Fields)"
        },
        "$:/language/Import/Listing/Rename/Tooltip": {
            "title": "$:/language/Import/Listing/Rename/Tooltip",
            "text": "Rename tiddler before importing"
        },
        "$:/language/Import/Listing/Rename/Prompt": {
            "title": "$:/language/Import/Listing/Rename/Prompt",
            "text": "Rename to:"
        },
        "$:/language/Import/Listing/Rename/ConfirmRename": {
            "title": "$:/language/Import/Listing/Rename/ConfirmRename",
            "text": "Rename tiddler"
        },
        "$:/language/Import/Listing/Rename/CancelRename": {
            "title": "$:/language/Import/Listing/Rename/CancelRename",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Rename/OverwriteWarning": {
            "title": "$:/language/Import/Listing/Rename/OverwriteWarning",
            "text": "A tiddler with this title already exists."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
            "text": "Blocked incompatible or obsolete plugin."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
            "text": "Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)."
        },
        "$:/language/Import/Upgrader/Plugins/Upgraded": {
            "title": "$:/language/Import/Upgrader/Plugins/Upgraded",
            "text": "Upgraded plugin from <<incoming>> to <<upgraded>>."
        },
        "$:/language/Import/Upgrader/State/Suppressed": {
            "title": "$:/language/Import/Upgrader/State/Suppressed",
            "text": "Blocked temporary state tiddler."
        },
        "$:/language/Import/Upgrader/System/Suppressed": {
            "title": "$:/language/Import/Upgrader/System/Suppressed",
            "text": "Blocked system tiddler."
        },
        "$:/language/Import/Upgrader/System/Warning": {
            "title": "$:/language/Import/Upgrader/System/Warning",
            "text": "Core module tiddler."
        },
        "$:/language/Import/Upgrader/System/Alert": {
            "title": "$:/language/Import/Upgrader/System/Alert",
            "text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."
        },
        "$:/language/Import/Upgrader/ThemeTweaks/Created": {
            "title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
            "text": "Migrated theme tweak from <$text text=<<from>>/>."
        },
        "$:/language/AboveStory/ClassicPlugin/Warning": {
            "title": "$:/language/AboveStory/ClassicPlugin/Warning",
            "text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
        },
        "$:/language/BinaryWarning/Prompt": {
            "title": "$:/language/BinaryWarning/Prompt",
            "text": "This tiddler contains binary data"
        },
        "$:/language/ClassicWarning/Hint": {
            "title": "$:/language/ClassicWarning/Hint",
            "text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
        },
        "$:/language/ClassicWarning/Upgrade/Caption": {
            "title": "$:/language/ClassicWarning/Upgrade/Caption",
            "text": "upgrade"
        },
        "$:/language/CloseAll/Button": {
            "title": "$:/language/CloseAll/Button",
            "text": "close all"
        },
        "$:/language/ColourPicker/Recent": {
            "title": "$:/language/ColourPicker/Recent",
            "text": "Recent:"
        },
        "$:/language/ConfirmCancelTiddler": {
            "title": "$:/language/ConfirmCancelTiddler",
            "text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmDeleteTiddler": {
            "title": "$:/language/ConfirmDeleteTiddler",
            "text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmOverwriteTiddler": {
            "title": "$:/language/ConfirmOverwriteTiddler",
            "text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmEditShadowTiddler": {
            "title": "$:/language/ConfirmEditShadowTiddler",
            "text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmAction": {
            "title": "$:/language/ConfirmAction",
            "text": "Do you wish to proceed?"
        },
        "$:/language/Count": {
            "title": "$:/language/Count",
            "text": "count"
        },
        "$:/language/DefaultNewTiddlerTitle": {
            "title": "$:/language/DefaultNewTiddlerTitle",
            "text": "New Tiddler"
        },
        "$:/language/Diffs/CountMessage": {
            "title": "$:/language/Diffs/CountMessage",
            "text": "<<diff-count>> differences"
        },
        "$:/language/DropMessage": {
            "title": "$:/language/DropMessage",
            "text": "Drop here (or use the 'Escape' key to cancel)"
        },
        "$:/language/Encryption/Cancel": {
            "title": "$:/language/Encryption/Cancel",
            "text": "Cancel"
        },
        "$:/language/Encryption/ConfirmClearPassword": {
            "title": "$:/language/Encryption/ConfirmClearPassword",
            "text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
        },
        "$:/language/Encryption/PromptSetPassword": {
            "title": "$:/language/Encryption/PromptSetPassword",
            "text": "Set a new password for this TiddlyWiki"
        },
        "$:/language/Encryption/Username": {
            "title": "$:/language/Encryption/Username",
            "text": "Username"
        },
        "$:/language/Encryption/Password": {
            "title": "$:/language/Encryption/Password",
            "text": "Password"
        },
        "$:/language/Encryption/RepeatPassword": {
            "title": "$:/language/Encryption/RepeatPassword",
            "text": "Repeat password"
        },
        "$:/language/Encryption/PasswordNoMatch": {
            "title": "$:/language/Encryption/PasswordNoMatch",
            "text": "Passwords do not match"
        },
        "$:/language/Encryption/SetPassword": {
            "title": "$:/language/Encryption/SetPassword",
            "text": "Set password"
        },
        "$:/language/Error/Caption": {
            "title": "$:/language/Error/Caption",
            "text": "Error"
        },
        "$:/language/Error/EditConflict": {
            "title": "$:/language/Error/EditConflict",
            "text": "File changed on server"
        },
        "$:/language/Error/Filter": {
            "title": "$:/language/Error/Filter",
            "text": "Filter error"
        },
        "$:/language/Error/FilterSyntax": {
            "title": "$:/language/Error/FilterSyntax",
            "text": "Syntax error in filter expression"
        },
        "$:/language/Error/FilterRunPrefix": {
            "title": "$:/language/Error/FilterRunPrefix",
            "text": "Filter Error: Unknown prefix for filter run"
        },
        "$:/language/Error/IsFilterOperator": {
            "title": "$:/language/Error/IsFilterOperator",
            "text": "Filter Error: Unknown operand for the 'is' filter operator"
        },
        "$:/language/Error/FormatFilterOperator": {
            "title": "$:/language/Error/FormatFilterOperator",
            "text": "Filter Error: Unknown suffix for the 'format' filter operator"
        },
        "$:/language/Error/LoadingPluginLibrary": {
            "title": "$:/language/Error/LoadingPluginLibrary",
            "text": "Error loading plugin library"
        },
        "$:/language/Error/NetworkErrorAlert": {
            "title": "$:/language/Error/NetworkErrorAlert",
            "text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
        },
        "$:/language/Error/RecursiveTransclusion": {
            "title": "$:/language/Error/RecursiveTransclusion",
            "text": "Recursive transclusion error in transclude widget"
        },
        "$:/language/Error/RetrievingSkinny": {
            "title": "$:/language/Error/RetrievingSkinny",
            "text": "Error retrieving skinny tiddler list"
        },
        "$:/language/Error/SavingToTWEdit": {
            "title": "$:/language/Error/SavingToTWEdit",
            "text": "Error saving to TWEdit"
        },
        "$:/language/Error/WhileSaving": {
            "title": "$:/language/Error/WhileSaving",
            "text": "Error while saving"
        },
        "$:/language/Error/XMLHttpRequest": {
            "title": "$:/language/Error/XMLHttpRequest",
            "text": "XMLHttpRequest error code"
        },
        "$:/language/InternalJavaScriptError/Title": {
            "title": "$:/language/InternalJavaScriptError/Title",
            "text": "Internal JavaScript Error"
        },
        "$:/language/InternalJavaScriptError/Hint": {
            "title": "$:/language/InternalJavaScriptError/Hint",
            "text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
        },
        "$:/language/InvalidFieldName": {
            "title": "$:/language/InvalidFieldName",
            "text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
        },
        "$:/language/LayoutSwitcher/Description": {
            "title": "$:/language/LayoutSwitcher/Description",
            "text": "Open the layout switcher"
        },
        "$:/language/LazyLoadingWarning": {
            "title": "$:/language/LazyLoadingWarning",
            "text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
        },
        "$:/language/LoginToTiddlySpace": {
            "title": "$:/language/LoginToTiddlySpace",
            "text": "Login to TiddlySpace"
        },
        "$:/language/Manager/Controls/FilterByTag/None": {
            "title": "$:/language/Manager/Controls/FilterByTag/None",
            "text": "(none)"
        },
        "$:/language/Manager/Controls/FilterByTag/Prompt": {
            "title": "$:/language/Manager/Controls/FilterByTag/Prompt",
            "text": "Filter by tag:"
        },
        "$:/language/Manager/Controls/Order/Prompt": {
            "title": "$:/language/Manager/Controls/Order/Prompt",
            "text": "Reverse order"
        },
        "$:/language/Manager/Controls/Search/Placeholder": {
            "title": "$:/language/Manager/Controls/Search/Placeholder",
            "text": "Search"
        },
        "$:/language/Manager/Controls/Search/Prompt": {
            "title": "$:/language/Manager/Controls/Search/Prompt",
            "text": "Search:"
        },
        "$:/language/Manager/Controls/Show/Option/Tags": {
            "title": "$:/language/Manager/Controls/Show/Option/Tags",
            "text": "tags"
        },
        "$:/language/Manager/Controls/Show/Option/Tiddlers": {
            "title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
            "text": "tiddlers"
        },
        "$:/language/Manager/Controls/Show/Prompt": {
            "title": "$:/language/Manager/Controls/Show/Prompt",
            "text": "Show:"
        },
        "$:/language/Manager/Controls/Sort/Prompt": {
            "title": "$:/language/Manager/Controls/Sort/Prompt",
            "text": "Sort by:"
        },
        "$:/language/Manager/Item/Colour": {
            "title": "$:/language/Manager/Item/Colour",
            "text": "Colour"
        },
        "$:/language/Manager/Item/Fields": {
            "title": "$:/language/Manager/Item/Fields",
            "text": "Fields"
        },
        "$:/language/Manager/Item/Icon/None": {
            "title": "$:/language/Manager/Item/Icon/None",
            "text": "(none)"
        },
        "$:/language/Manager/Item/Icon": {
            "title": "$:/language/Manager/Item/Icon",
            "text": "Icon"
        },
        "$:/language/Manager/Item/RawText": {
            "title": "$:/language/Manager/Item/RawText",
            "text": "Raw text"
        },
        "$:/language/Manager/Item/Tags": {
            "title": "$:/language/Manager/Item/Tags",
            "text": "Tags"
        },
        "$:/language/Manager/Item/Tools": {
            "title": "$:/language/Manager/Item/Tools",
            "text": "Tools"
        },
        "$:/language/Manager/Item/WikifiedText": {
            "title": "$:/language/Manager/Item/WikifiedText",
            "text": "Wikified text"
        },
        "$:/language/MissingTiddler/Hint": {
            "title": "$:/language/MissingTiddler/Hint",
            "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
        },
        "$:/language/No": {
            "title": "$:/language/No",
            "text": "No"
        },
        "$:/language/OfficialPluginLibrary": {
            "title": "$:/language/OfficialPluginLibrary",
            "text": "Official ~TiddlyWiki Plugin Library"
        },
        "$:/language/OfficialPluginLibrary/Hint": {
            "title": "$:/language/OfficialPluginLibrary/Hint",
            "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
        },
        "$:/language/PageTemplate/Description": {
            "title": "$:/language/PageTemplate/Description",
            "text": "the default ~TiddlyWiki layout"
        },
        "$:/language/PageTemplate/Name": {
            "title": "$:/language/PageTemplate/Name",
            "text": "Default ~PageTemplate"
        },
        "$:/language/PluginReloadWarning": {
            "title": "$:/language/PluginReloadWarning",
            "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
        },
        "$:/language/RecentChanges/DateFormat": {
            "title": "$:/language/RecentChanges/DateFormat",
            "text": "DDth MMM YYYY"
        },
        "$:/language/Shortcuts/Input/AdvancedSearch/Hint": {
            "title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint",
            "text": "Open the ~AdvancedSearch panel from within the sidebar search field"
        },
        "$:/language/Shortcuts/Input/Accept/Hint": {
            "title": "$:/language/Shortcuts/Input/Accept/Hint",
            "text": "Accept the selected item"
        },
        "$:/language/Shortcuts/Input/AcceptVariant/Hint": {
            "title": "$:/language/Shortcuts/Input/AcceptVariant/Hint",
            "text": "Accept the selected item (variant)"
        },
        "$:/language/Shortcuts/Input/Cancel/Hint": {
            "title": "$:/language/Shortcuts/Input/Cancel/Hint",
            "text": "Clear the input field"
        },
        "$:/language/Shortcuts/Input/Down/Hint": {
            "title": "$:/language/Shortcuts/Input/Down/Hint",
            "text": "Select the next item"
        },
        "$:/language/Shortcuts/Input/Tab-Left/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Left/Hint",
            "text": "Select the previous Tab"
        },
        "$:/language/Shortcuts/Input/Tab-Right/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Right/Hint",
            "text": "Select the next Tab"
        },
        "$:/language/Shortcuts/Input/Up/Hint": {
            "title": "$:/language/Shortcuts/Input/Up/Hint",
            "text": "Select the previous item"
        },
        "$:/language/Shortcuts/SidebarLayout/Hint": {
            "title": "$:/language/Shortcuts/SidebarLayout/Hint",
            "text": "Change the sidebar layout"
        },
        "$:/language/Switcher/Subtitle/theme": {
            "title": "$:/language/Switcher/Subtitle/theme",
            "text": "Switch Theme"
        },
        "$:/language/Switcher/Subtitle/layout": {
            "title": "$:/language/Switcher/Subtitle/layout",
            "text": "Switch Layout"
        },
        "$:/language/Switcher/Subtitle/language": {
            "title": "$:/language/Switcher/Subtitle/language",
            "text": "Switch Language"
        },
        "$:/language/Switcher/Subtitle/palette": {
            "title": "$:/language/Switcher/Subtitle/palette",
            "text": "Switch Palette"
        },
        "$:/language/SystemTiddler/Tooltip": {
            "title": "$:/language/SystemTiddler/Tooltip",
            "text": "This is a system tiddler"
        },
        "$:/language/SystemTiddlers/Include/Prompt": {
            "title": "$:/language/SystemTiddlers/Include/Prompt",
            "text": "Include system tiddlers"
        },
        "$:/language/TagManager/Colour/Heading": {
            "title": "$:/language/TagManager/Colour/Heading",
            "text": "Colour"
        },
        "$:/language/TagManager/Count/Heading": {
            "title": "$:/language/TagManager/Count/Heading",
            "text": "Count"
        },
        "$:/language/TagManager/Icon/Heading": {
            "title": "$:/language/TagManager/Icon/Heading",
            "text": "Icon"
        },
        "$:/language/TagManager/Icons/None": {
            "title": "$:/language/TagManager/Icons/None",
            "text": "None"
        },
        "$:/language/TagManager/Info/Heading": {
            "title": "$:/language/TagManager/Info/Heading",
            "text": "Info"
        },
        "$:/language/TagManager/Tag/Heading": {
            "title": "$:/language/TagManager/Tag/Heading",
            "text": "Tag"
        },
        "$:/language/Tiddler/DateFormat": {
            "title": "$:/language/Tiddler/DateFormat",
            "text": "DDth MMM YYYY at hh12:0mmam"
        },
        "$:/language/UnsavedChangesWarning": {
            "title": "$:/language/UnsavedChangesWarning",
            "text": "You have unsaved changes in TiddlyWiki"
        },
        "$:/language/Yes": {
            "title": "$:/language/Yes",
            "text": "Yes"
        },
        "$:/language/Modals/Download": {
            "title": "$:/language/Modals/Download",
            "subtitle": "Download changes",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/DownloadingChanges.html",
            "text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
        },
        "$:/language/Modals/SaveInstructions": {
            "title": "$:/language/Modals/SaveInstructions",
            "subtitle": "Save your work",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/SavingChanges.html",
            "text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
        },
        "$:/config/NewJournal/Title": {
            "title": "$:/config/NewJournal/Title",
            "text": "DDth MMM YYYY"
        },
        "$:/config/NewJournal/Text": {
            "title": "$:/config/NewJournal/Text",
            "text": ""
        },
        "$:/config/NewJournal/Tags": {
            "title": "$:/config/NewJournal/Tags",
            "text": "Journal\n"
        },
        "$:/language/Notifications/Save/Done": {
            "title": "$:/language/Notifications/Save/Done",
            "text": "Saved wiki"
        },
        "$:/language/Notifications/Save/Starting": {
            "title": "$:/language/Notifications/Save/Starting",
            "text": "Starting to save wiki"
        },
        "$:/language/Notifications/CopiedToClipboard/Succeeded": {
            "title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
            "text": "Copied to clipboard!"
        },
        "$:/language/Notifications/CopiedToClipboard/Failed": {
            "title": "$:/language/Notifications/CopiedToClipboard/Failed",
            "text": "Failed to copy to clipboard!"
        },
        "$:/language/Search/DefaultResults/Caption": {
            "title": "$:/language/Search/DefaultResults/Caption",
            "text": "List"
        },
        "$:/language/Search/Filter/Caption": {
            "title": "$:/language/Search/Filter/Caption",
            "text": "Filter"
        },
        "$:/language/Search/Filter/Hint": {
            "title": "$:/language/Search/Filter/Hint",
            "text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
        },
        "$:/language/Search/Filter/Matches": {
            "title": "$:/language/Search/Filter/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches": {
            "title": "$:/language/Search/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches/All": {
            "title": "$:/language/Search/Matches/All",
            "text": "All matches:"
        },
        "$:/language/Search/Matches/Title": {
            "title": "$:/language/Search/Matches/Title",
            "text": "Title matches:"
        },
        "$:/language/Search/Search": {
            "title": "$:/language/Search/Search",
            "text": "Search"
        },
        "$:/language/Search/Search/TooShort": {
            "title": "$:/language/Search/Search/TooShort",
            "text": "Search text too short"
        },
        "$:/language/Search/Shadows/Caption": {
            "title": "$:/language/Search/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/Search/Shadows/Hint": {
            "title": "$:/language/Search/Shadows/Hint",
            "text": "Search for shadow tiddlers"
        },
        "$:/language/Search/Shadows/Matches": {
            "title": "$:/language/Search/Shadows/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Standard/Caption": {
            "title": "$:/language/Search/Standard/Caption",
            "text": "Standard"
        },
        "$:/language/Search/Standard/Hint": {
            "title": "$:/language/Search/Standard/Hint",
            "text": "Search for standard tiddlers"
        },
        "$:/language/Search/Standard/Matches": {
            "title": "$:/language/Search/Standard/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/System/Caption": {
            "title": "$:/language/Search/System/Caption",
            "text": "System"
        },
        "$:/language/Search/System/Hint": {
            "title": "$:/language/Search/System/Hint",
            "text": "Search for system tiddlers"
        },
        "$:/language/Search/System/Matches": {
            "title": "$:/language/Search/System/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/SideBar/All/Caption": {
            "title": "$:/language/SideBar/All/Caption",
            "text": "All"
        },
        "$:/language/SideBar/Contents/Caption": {
            "title": "$:/language/SideBar/Contents/Caption",
            "text": "Contents"
        },
        "$:/language/SideBar/Drafts/Caption": {
            "title": "$:/language/SideBar/Drafts/Caption",
            "text": "Drafts"
        },
        "$:/language/SideBar/Explorer/Caption": {
            "title": "$:/language/SideBar/Explorer/Caption",
            "text": "Explorer"
        },
        "$:/language/SideBar/Missing/Caption": {
            "title": "$:/language/SideBar/Missing/Caption",
            "text": "Missing"
        },
        "$:/language/SideBar/More/Caption": {
            "title": "$:/language/SideBar/More/Caption",
            "text": "More"
        },
        "$:/language/SideBar/Open/Caption": {
            "title": "$:/language/SideBar/Open/Caption",
            "text": "Open"
        },
        "$:/language/SideBar/Orphans/Caption": {
            "title": "$:/language/SideBar/Orphans/Caption",
            "text": "Orphans"
        },
        "$:/language/SideBar/Recent/Caption": {
            "title": "$:/language/SideBar/Recent/Caption",
            "text": "Recent"
        },
        "$:/language/SideBar/Shadows/Caption": {
            "title": "$:/language/SideBar/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/SideBar/System/Caption": {
            "title": "$:/language/SideBar/System/Caption",
            "text": "System"
        },
        "$:/language/SideBar/Tags/Caption": {
            "title": "$:/language/SideBar/Tags/Caption",
            "text": "Tags"
        },
        "$:/language/SideBar/Tags/Untagged/Caption": {
            "title": "$:/language/SideBar/Tags/Untagged/Caption",
            "text": "untagged"
        },
        "$:/language/SideBar/Tools/Caption": {
            "title": "$:/language/SideBar/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/SideBar/Types/Caption": {
            "title": "$:/language/SideBar/Types/Caption",
            "text": "Types"
        },
        "$:/SiteSubtitle": {
            "title": "$:/SiteSubtitle",
            "text": "a non-linear personal web notebook"
        },
        "$:/SiteTitle": {
            "title": "$:/SiteTitle",
            "text": "My ~TiddlyWiki"
        },
        "$:/language/Snippets/ListByTag": {
            "title": "$:/language/Snippets/ListByTag",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "List of tiddlers by tag",
            "text": "<<list-links \"[tag[task]sort[title]]\">>\n"
        },
        "$:/language/Snippets/MacroDefinition": {
            "title": "$:/language/Snippets/MacroDefinition",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Macro definition",
            "text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
        },
        "$:/language/Snippets/Table4x3": {
            "title": "$:/language/Snippets/Table4x3",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table with 4 columns by 3 rows",
            "text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
        },
        "$:/language/Snippets/TableOfContents": {
            "title": "$:/language/Snippets/TableOfContents",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table of Contents",
            "text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
        },
        "$:/language/ThemeTweaks/ThemeTweaks": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks",
            "text": "Theme Tweaks"
        },
        "$:/language/ThemeTweaks/ThemeTweaks/Hint": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
            "text": "You can tweak certain aspects of the ''Vanilla'' theme."
        },
        "$:/language/ThemeTweaks/Options": {
            "title": "$:/language/ThemeTweaks/Options",
            "text": "Options"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout",
            "text": "Sidebar layout"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
            "text": "Fixed story, fluid sidebar"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
            "text": "Fluid story, fixed sidebar"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles",
            "text": "Sticky titles"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
            "text": "Causes tiddler titles to \"stick\" to the top of the browser window"
        },
        "$:/language/ThemeTweaks/Options/CodeWrapping": {
            "title": "$:/language/ThemeTweaks/Options/CodeWrapping",
            "text": "Wrap long lines in code blocks"
        },
        "$:/language/ThemeTweaks/Settings": {
            "title": "$:/language/ThemeTweaks/Settings",
            "text": "Settings"
        },
        "$:/language/ThemeTweaks/Settings/FontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/FontFamily",
            "text": "Font family"
        },
        "$:/language/ThemeTweaks/Settings/CodeFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
            "text": "Code font family"
        },
        "$:/language/ThemeTweaks/Settings/EditorFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
            "text": "Editor font family"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImage": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
            "text": "Page background image"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
            "text": "Page background image attachment"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
            "text": "Scroll with tiddlers"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
            "text": "Fixed to window"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
            "text": "Page background image size"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
            "text": "Auto"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
            "text": "Cover"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
            "text": "Contain"
        },
        "$:/language/ThemeTweaks/Metrics": {
            "title": "$:/language/ThemeTweaks/Metrics",
            "text": "Sizes"
        },
        "$:/language/ThemeTweaks/Metrics/FontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/FontSize",
            "text": "Font size"
        },
        "$:/language/ThemeTweaks/Metrics/LineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/LineHeight",
            "text": "Line height"
        },
        "$:/language/ThemeTweaks/Metrics/BodyFontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
            "text": "Font size for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
            "text": "Line height for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
            "text": "Story left position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
            "text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop",
            "text": "Story top position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
            "text": "how far the top margin of the story river<br>is from the top of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight",
            "text": "Story right"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
            "text": "how far the left margin of the sidebar <br>is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
            "text": "Story width"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
            "text": "the overall width of the story river"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
            "text": "Tiddler width"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
            "text": "within the story river"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
            "text": "Sidebar breakpoint"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
            "text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
            "text": "Sidebar width"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
            "text": "the width of the sidebar in fluid-fixed layout"
        },
        "$:/language/TiddlerInfo/Advanced/Caption": {
            "title": "$:/language/TiddlerInfo/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
            "text": "none"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
            "text": "Plugin Details"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
            "text": "This plugin contains the following shadow tiddlers:"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
            "text": "Shadow Status"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
            "text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
            "text": "It is overridden by an ordinary tiddler"
        },
        "$:/language/TiddlerInfo/Fields/Caption": {
            "title": "$:/language/TiddlerInfo/Fields/Caption",
            "text": "Fields"
        },
        "$:/language/TiddlerInfo/List/Caption": {
            "title": "$:/language/TiddlerInfo/List/Caption",
            "text": "List"
        },
        "$:/language/TiddlerInfo/List/Empty": {
            "title": "$:/language/TiddlerInfo/List/Empty",
            "text": "This tiddler does not have a list"
        },
        "$:/language/TiddlerInfo/Listed/Caption": {
            "title": "$:/language/TiddlerInfo/Listed/Caption",
            "text": "Listed"
        },
        "$:/language/TiddlerInfo/Listed/Empty": {
            "title": "$:/language/TiddlerInfo/Listed/Empty",
            "text": "This tiddler is not listed by any others"
        },
        "$:/language/TiddlerInfo/References/Caption": {
            "title": "$:/language/TiddlerInfo/References/Caption",
            "text": "Backlinks"
        },
        "$:/language/TiddlerInfo/References/Empty": {
            "title": "$:/language/TiddlerInfo/References/Empty",
            "text": "No tiddlers link to this one"
        },
        "$:/language/TiddlerInfo/Tagging/Caption": {
            "title": "$:/language/TiddlerInfo/Tagging/Caption",
            "text": "Tagging"
        },
        "$:/language/TiddlerInfo/Tagging/Empty": {
            "title": "$:/language/TiddlerInfo/Tagging/Empty",
            "text": "No tiddlers are tagged with this one"
        },
        "$:/language/TiddlerInfo/Tools/Caption": {
            "title": "$:/language/TiddlerInfo/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/Docs/Types/application/javascript": {
            "title": "$:/language/Docs/Types/application/javascript",
            "description": "JavaScript code",
            "name": "application/javascript",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/json": {
            "title": "$:/language/Docs/Types/application/json",
            "description": "JSON data",
            "name": "application/json",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/x-tiddler-dictionary": {
            "title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
            "description": "Data dictionary",
            "name": "application/x-tiddler-dictionary",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/image/gif": {
            "title": "$:/language/Docs/Types/image/gif",
            "description": "GIF image",
            "name": "image/gif",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/jpeg": {
            "title": "$:/language/Docs/Types/image/jpeg",
            "description": "JPEG image",
            "name": "image/jpeg",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/png": {
            "title": "$:/language/Docs/Types/image/png",
            "description": "PNG image",
            "name": "image/png",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/svg+xml": {
            "title": "$:/language/Docs/Types/image/svg+xml",
            "description": "Structured Vector Graphics image",
            "name": "image/svg+xml",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/x-icon": {
            "title": "$:/language/Docs/Types/image/x-icon",
            "description": "ICO format icon file",
            "name": "image/x-icon",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/text/css": {
            "title": "$:/language/Docs/Types/text/css",
            "description": "Static stylesheet",
            "name": "text/css",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/text/html": {
            "title": "$:/language/Docs/Types/text/html",
            "description": "HTML markup",
            "name": "text/html",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/plain": {
            "title": "$:/language/Docs/Types/text/plain",
            "description": "Plain text",
            "name": "text/plain",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/vnd.tiddlywiki": {
            "title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
            "description": "TiddlyWiki 5",
            "name": "text/vnd.tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/x-tiddlywiki": {
            "title": "$:/language/Docs/Types/text/x-tiddlywiki",
            "description": "TiddlyWiki Classic",
            "name": "text/x-tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/languages/en-GB/icon": {
            "title": "$:/languages/en-GB/icon",
            "type": "image/svg+xml",
            "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
        },
        "$:/languages/en-GB": {
            "title": "$:/languages/en-GB",
            "name": "en-GB",
            "description": "English (British)",
            "author": "JeremyRuston",
            "core-version": ">=5.0.0\"",
            "text": "Stub pseudo-plugin for the default language"
        },
        "$:/core/modules/commander.js": {
            "title": "$:/core/modules/commander.js",
            "text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/commands/build.js": {
            "title": "$:/core/modules/commands/build.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/clearpassword.js": {
            "title": "$:/core/modules/commands/clearpassword.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/deletetiddlers.js": {
            "title": "$:/core/modules/commands/deletetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/editions.js": {
            "title": "$:/core/modules/commands/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\"    \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/fetch.js": {
            "title": "$:/core/modules/commands/fetch.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t    var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t    \tdata = [];\n\t    self.commander.write(\"Reading \" + url + \": \");\n\t    response.on(\"data\",function(chunk) {\n\t        data.push(chunk);\n\t        self.commander.write(\".\");\n\t    });\n\t    response.on(\"end\",function() {\n\t        self.commander.write(\"\\n\");\n\t        if(response.statusCode === 200) {\n\t\t        self.processBody(Buffer.concat(data),type,options,url);\n\t\t        callback(null);\n\t        } else {\n\t        \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t        \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t        \t} else {\n\t\t        \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t        \t\t\n\t        \t}\n\t        }\n\t   \t});\n\t   \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t   \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/help.js": {
            "title": "$:/core/modules/commands/help.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/import.js": {
            "title": "$:/core/modules/commands/import.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/init.js": {
            "title": "$:/core/modules/commands/init.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/listen.js": {
            "title": "$:/core/modules/commands/listen.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/load.js": {
            "title": "$:/core/modules/commands/load.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/makelibrary.js": {
            "title": "$:/core/modules/commands/makelibrary.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/output.js": {
            "title": "$:/core/modules/commands/output.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/password.js": {
            "title": "$:/core/modules/commands/password.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/render.js": {
            "title": "$:/core/modules/commands/render.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddler.js": {
            "title": "$:/core/modules/commands/rendertiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddlers.js": {
            "title": "$:/core/modules/commands/rendertiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/save.js": {
            "title": "$:/core/modules/commands/save.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savelibrarytiddlers.js": {
            "title": "$:/core/modules/commands/savelibrarytiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddler.js": {
            "title": "$:/core/modules/commands/savetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddlers.js": {
            "title": "$:/core/modules/commands/savetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savewikifolder.js": {
            "title": "$:/core/modules/commands/savewikifolder.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/server.js": {
            "title": "$:/core/modules/commands/server.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/setfield.js": {
            "title": "$:/core/modules/commands/setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/unpackplugin.js": {
            "title": "$:/core/modules/commands/unpackplugin.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/verbose.js": {
            "title": "$:/core/modules/commands/verbose.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n  \" + $tw.boot.logMessages.join(\"\\n  \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/version.js": {
            "title": "$:/core/modules/commands/version.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/config.js": {
            "title": "$:/core/modules/config.js",
            "text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter:   \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
            "type": "application/javascript",
            "module-type": "config"
        },
        "$:/core/modules/deserializers.js": {
            "title": "$:/core/modules/deserializers.js",
            "text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlerdeserializer"
        },
        "$:/core/modules/editor/engines/framed.js": {
            "title": "$:/core/modules/editor/engines/framed.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/engines/simple.js": {
            "title": "$:/core/modules/editor/engines/simple.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/factory.js": {
            "title": "$:/core/modules/editor/factory.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t    clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t    el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/operations/bitmap/clear.js": {
            "title": "$:/core/modules/editor/operations/bitmap/clear.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/resize.js": {
            "title": "$:/core/modules/editor/operations/bitmap/resize.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/rotate-left.js": {
            "title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/text/excise.js": {
            "title": "$:/core/modules/editor/operations/text/excise.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ?  [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/make-link.js": {
            "title": "$:/core/modules/editor/operations/text/make-link.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/prefix-lines.js": {
            "title": "$:/core/modules/editor/operations/text/prefix-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline =  prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-all.js": {
            "title": "$:/core/modules/editor/operations/text/replace-all.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-selection.js": {
            "title": "$:/core/modules/editor/operations/text/replace-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/save-selection.js": {
            "title": "$:/core/modules/editor/operations/text/save-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-lines.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-selection.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/filterrunprefixes/all.js": {
            "title": "$:/core/modules/filterrunprefixes/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/and.js": {
            "title": "$:/core/modules/filterrunprefixes/and.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/else.js": {
            "title": "$:/core/modules/filterrunprefixes/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/except.js": {
            "title": "$:/core/modules/filterrunprefixes/except.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/filter.js": {
            "title": "$:/core/modules/filterrunprefixes/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/intersection.js": {
            "title": "$:/core/modules/filterrunprefixes/intersection.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/or.js": {
            "title": "$:/core/modules/filterrunprefixes/or.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/reduce.js": {
            "title": "$:/core/modules/filterrunprefixes/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" +  (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filters/addprefix.js": {
            "title": "$:/core/modules/filters/addprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/addsuffix.js": {
            "title": "$:/core/modules/filters/addsuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/after.js": {
            "title": "$:/core/modules/filters/after.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/all/current.js": {
            "title": "$:/core/modules/filters/all/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/missing.js": {
            "title": "$:/core/modules/filters/all/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/orphans.js": {
            "title": "$:/core/modules/filters/all/orphans.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/shadows.js": {
            "title": "$:/core/modules/filters/all/shadows.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tags.js": {
            "title": "$:/core/modules/filters/all/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tiddlers.js": {
            "title": "$:/core/modules/filters/all/tiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all.js": {
            "title": "$:/core/modules/filters/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/backlinks.js": {
            "title": "$:/core/modules/filters/backlinks.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/before.js": {
            "title": "$:/core/modules/filters/before.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/commands.js": {
            "title": "$:/core/modules/filters/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/compare.js": {
            "title": "$:/core/modules/filters/compare.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/contains.js": {
            "title": "$:/core/modules/filters/contains.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/count.js": {
            "title": "$:/core/modules/filters/count.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/days.js": {
            "title": "$:/core/modules/filters/days.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/duplicateslugs.js": {
            "title": "$:/core/modules/filters/duplicateslugs.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/each.js": {
            "title": "$:/core/modules/filters/each.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/eachday.js": {
            "title": "$:/core/modules/filters/eachday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editiondescription.js": {
            "title": "$:/core/modules/filters/editiondescription.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editions.js": {
            "title": "$:/core/modules/filters/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/else.js": {
            "title": "$:/core/modules/filters/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/decodeuricomponent.js": {
            "title": "$:/core/modules/filters/decodeuricomponent.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/enlist.js": {
            "title": "$:/core/modules/filters/enlist.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/field.js": {
            "title": "$:/core/modules/filters/field.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/fields.js": {
            "title": "$:/core/modules/filters/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/filter.js": {
            "title": "$:/core/modules/filters/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/format/date.js": {
            "title": "$:/core/modules/filters/format/date.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format/relativedate.js": {
            "title": "$:/core/modules/filters/format/relativedate.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format.js": {
            "title": "$:/core/modules/filters/format.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/get.js": {
            "title": "$:/core/modules/filters/get.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getindex.js": {
            "title": "$:/core/modules/filters/getindex.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getvariable.js": {
            "title": "$:/core/modules/filters/getvariable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/has.js": {
            "title": "$:/core/modules/filters/has.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/haschanged.js": {
            "title": "$:/core/modules/filters/haschanged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/indexes.js": {
            "title": "$:/core/modules/filters/indexes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/insertbefore.js": {
            "title": "$:/core/modules/filters/insertbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/is/binary.js": {
            "title": "$:/core/modules/filters/is/binary.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/blank.js": {
            "title": "$:/core/modules/filters/is/blank.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/current.js": {
            "title": "$:/core/modules/filters/is/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/draft.js": {
            "title": "$:/core/modules/filters/is/draft.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/image.js": {
            "title": "$:/core/modules/filters/is/image.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/missing.js": {
            "title": "$:/core/modules/filters/is/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/orphan.js": {
            "title": "$:/core/modules/filters/is/orphan.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/shadow.js": {
            "title": "$:/core/modules/filters/is/shadow.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/system.js": {
            "title": "$:/core/modules/filters/is/system.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tag.js": {
            "title": "$:/core/modules/filters/is/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tiddler.js": {
            "title": "$:/core/modules/filters/is/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/variable.js": {
            "title": "$:/core/modules/filters/is/variable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is.js": {
            "title": "$:/core/modules/filters/is.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/limit.js": {
            "title": "$:/core/modules/filters/limit.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/links.js": {
            "title": "$:/core/modules/filters/links.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/list.js": {
            "title": "$:/core/modules/filters/list.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listed.js": {
            "title": "$:/core/modules/filters/listed.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listops.js": {
            "title": "$:/core/modules/filters/listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/lookup.js": {
            "title": "$:/core/modules/filters/lookup.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/match.js": {
            "title": "$:/core/modules/filters/match.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/math.js": {
            "title": "$:/core/modules/filters/math.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/minlength.js": {
            "title": "$:/core/modules/filters/minlength.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/modules.js": {
            "title": "$:/core/modules/filters/modules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/moduletypes.js": {
            "title": "$:/core/modules/filters/moduletypes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/next.js": {
            "title": "$:/core/modules/filters/next.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/plugintiddlers.js": {
            "title": "$:/core/modules/filters/plugintiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/prefix.js": {
            "title": "$:/core/modules/filters/prefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/previous.js": {
            "title": "$:/core/modules/filters/previous.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/range.js": {
            "title": "$:/core/modules/filters/range.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/reduce.js": {
            "title": "$:/core/modules/filters/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" +  list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/regexp.js": {
            "title": "$:/core/modules/filters/regexp.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removeprefix.js": {
            "title": "$:/core/modules/filters/removeprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removesuffix.js": {
            "title": "$:/core/modules/filters/removesuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sameday.js": {
            "title": "$:/core/modules/filters/sameday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/search.js": {
            "title": "$:/core/modules/filters/search.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/shadowsource.js": {
            "title": "$:/core/modules/filters/shadowsource.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/slugify.js": {
            "title": "$:/core/modules/filters/slugify.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sort.js": {
            "title": "$:/core/modules/filters/sort.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sortsub.js": {
            "title": "$:/core/modules/filters/sortsub.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/splitbefore.js": {
            "title": "$:/core/modules/filters/splitbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/storyviews.js": {
            "title": "$:/core/modules/filters/storyviews.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/strings.js": {
            "title": "$:/core/modules/filters/strings.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subfilter.js": {
            "title": "$:/core/modules/filters/subfilter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subtiddlerfields.js": {
            "title": "$:/core/modules/filters/subtiddlerfields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/suffix.js": {
            "title": "$:/core/modules/filters/suffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tag.js": {
            "title": "$:/core/modules/filters/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tagging.js": {
            "title": "$:/core/modules/filters/tagging.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tags.js": {
            "title": "$:/core/modules/filters/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/then.js": {
            "title": "$:/core/modules/filters/then.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/title.js": {
            "title": "$:/core/modules/filters/title.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/untagged.js": {
            "title": "$:/core/modules/filters/untagged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/variables.js": {
            "title": "$:/core/modules/filters/variables.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/wikiparserrules.js": {
            "title": "$:/core/modules/filters/wikiparserrules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/x-listops.js": {
            "title": "$:/core/modules/filters/x-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset =  (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters.js": {
            "title": "$:/core/modules/filters.js",
            "text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tfunction parseOperand(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/indexers/backlinks-indexer.js": {
            "title": "$:/core/modules/indexers/backlinks-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser =  this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t    oldLinks = [],\n\t    self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/field-indexer.js": {
            "title": "$:/core/modules/indexers/field-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/tag-indexer.js": {
            "title": "$:/core/modules/indexers/tag-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/info/platform.js": {
            "title": "$:/core/modules/info/platform.js",
            "text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "info"
        },
        "$:/core/modules/keyboard.js": {
            "title": "$:/core/modules/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t   (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t   (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t   (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t   (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/language.js": {
            "title": "$:/core/modules/language.js",
            "text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/macros/changecount.js": {
            "title": "$:/core/modules/macros/changecount.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/contrastcolour.js": {
            "title": "$:/core/modules/macros/contrastcolour.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/csvtiddlers.js": {
            "title": "$:/core/modules/macros/csvtiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/displayshortcuts.js": {
            "title": "$:/core/modules/macros/displayshortcuts.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t    return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddler.js": {
            "title": "$:/core/modules/macros/jsontiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddlers.js": {
            "title": "$:/core/modules/macros/jsontiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/makedatauri.js": {
            "title": "$:/core/modules/macros/makedatauri.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/now.js": {
            "title": "$:/core/modules/macros/now.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/qualify.js": {
            "title": "$:/core/modules/macros/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/resolvepath.js": {
            "title": "$:/core/modules/macros/resolvepath.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/unusedtitle.js": {
            "title": "$:/core/modules/macros/unusedtitle.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/version.js": {
            "title": "$:/core/modules/macros/version.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/parsers/audioparser.js": {
            "title": "$:/core/modules/parsers/audioparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/binaryparser.js": {
            "title": "$:/core/modules/parsers/binaryparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/csvparser.js": {
            "title": "$:/core/modules/parsers/csvparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/htmlparser.js": {
            "title": "$:/core/modules/parsers/htmlparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/imageparser.js": {
            "title": "$:/core/modules/parsers/imageparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/utils/parseutils.js": {
            "title": "$:/core/modules/utils/parseutils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/parsers/pdfparser.js": {
            "title": "$:/core/modules/parsers/pdfparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/textparser.js": {
            "title": "$:/core/modules/parsers/textparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/videoparser.js": {
            "title": "$:/core/modules/parsers/videoparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/dash.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"&ndash;\" : \"&mdash;\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/entity.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: &copy;\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/extlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/heading.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/html.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/html.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/image.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/image.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/import.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/import.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/list.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/list.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/rules.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/syslink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/table.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/table.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n  <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/wikiparser.js": {
            "title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined  && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t//  Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t//  Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/pluginswitcher.js": {
            "title": "$:/core/modules/pluginswitcher.js",
            "text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/saver-handler.js": {
            "title": "$:/core/modules/saver-handler.js",
            "text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/savers/andtidwiki.js": {
            "title": "$:/core/modules/savers/andtidwiki.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t    link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/beaker.js": {
            "title": "$:/core/modules/savers/beaker.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/custom.js": {
            "title": "$:/core/modules/savers/custom.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t//   Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/download.js": {
            "title": "$:/core/modules/savers/download.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/fsosaver.js": {
            "title": "$:/core/modules/savers/fsosaver.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitea.js": {
            "title": "$:/core/modules/savers/gitea.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/github.js": {
            "title": "$:/core/modules/savers/github.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitlab.js": {
            "title": "$:/core/modules/savers/gitlab.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/hyperdrive.js": {
            "title": "$:/core/modules/savers/hyperdrive.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/manualdownload.js": {
            "title": "$:/core/modules/savers/manualdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/msdownload.js": {
            "title": "$:/core/modules/savers/msdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/put.js": {
            "title": "$:/core/modules/savers/put.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyfox.js": {
            "title": "$:/core/modules/savers/tiddlyfox.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyie.js": {
            "title": "$:/core/modules/savers/tiddlyie.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/twedit.js": {
            "title": "$:/core/modules/savers/twedit.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/upload.js": {
            "title": "$:/core/modules/savers/upload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/server/authenticators/basic.js": {
            "title": "$:/core/modules/server/authenticators/basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/authenticators/header.js": {
            "title": "$:/core/modules/server/authenticators/header.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/routes/delete-tiddler.js": {
            "title": "$:/core/modules/server/routes/delete-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-favicon.js": {
            "title": "$:/core/modules/server/routes/get-favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-file.js": {
            "title": "$:/core/modules/server/routes/get-file.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-index.js": {
            "title": "$:/core/modules/server/routes/get-index.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-login-basic.js": {
            "title": "$:/core/modules/server/routes/get-login-basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-status.js": {
            "title": "$:/core/modules/server/routes/get-status.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler-html.js": {
            "title": "$:/core/modules/server/routes/get-tiddler-html.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler.js": {
            "title": "$:/core/modules/server/routes/get-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddlers-json.js": {
            "title": "$:/core/modules/server/routes/get-tiddlers-json.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/put-tiddler.js": {
            "title": "$:/core/modules/server/routes/put-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/server.js": {
            "title": "$:/core/modules/server/server.js",
            "text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/browser-messaging.js": {
            "title": "$:/core/modules/browser-messaging.js",
            "text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t  iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/commands.js": {
            "title": "$:/core/modules/startup/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/CSSescape.js": {
            "title": "$:/core/modules/startup/CSSescape.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/favicon.js": {
            "title": "$:/core/modules/startup/favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/info.js": {
            "title": "$:/core/modules/startup/info.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/load-modules.js": {
            "title": "$:/core/modules/startup/load-modules.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/password.js": {
            "title": "$:/core/modules/startup/password.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/plugins.js": {
            "title": "$:/core/modules/startup/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/render.js": {
            "title": "$:/core/modules/startup/render.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n   \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/rootwidget.js": {
            "title": "$:/core/modules/startup/rootwidget.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\t\n\t// Install the notification  mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard  mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup.js": {
            "title": "$:/core/modules/startup.js",
            "text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/story.js": {
            "title": "$:/core/modules/startup/story.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/windows.js": {
            "title": "$:/core/modules/startup/windows.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t    srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/story.js": {
            "title": "$:/core/modules/story.js",
            "text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/storyviews/classic.js": {
            "title": "$:/core/modules/storyviews/classic.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom:  currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/pop.js": {
            "title": "$:/core/modules/storyviews/pop.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/zoomin.js": {
            "title": "$:/core/modules/storyviews/zoomin.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx =  zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty =  zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/syncer.js": {
            "title": "$:/core/modules/syncer.js",
            "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\tif($tw.boot.files){\n\t\t\t// Remove the tiddler from $tw.boot.files\n\t\t\tdelete $tw.boot.files[self.title];\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/tiddler.js": {
            "title": "$:/core/modules/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlermethod"
        },
        "$:/core/modules/upgraders/plugins.js": {
            "title": "$:/core/modules/upgraders/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/system.js": {
            "title": "$:/core/modules/upgraders/system.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/themetweaks.js": {
            "title": "$:/core/modules/upgraders/themetweaks.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
            "text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/crypto.js": {
            "title": "$:/core/modules/utils/crypto.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/csv.js": {
            "title": "$:/core/modules/utils/csv.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
            "text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/dom/animations/slide.js": {
            "title": "$:/core/modules/utils/dom/animations/slide.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "animation"
        },
        "$:/core/modules/utils/dom/animator.js": {
            "title": "$:/core/modules/utils/dom/animator.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/browser.js": {
            "title": "$:/core/modules/utils/dom/browser.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/csscolorparser.js": {
            "title": "$:/core/modules/utils/dom/csscolorparser.js",
            "text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom.js": {
            "title": "$:/core/modules/utils/dom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n    // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/dragndrop.js": {
            "title": "$:/core/modules/utils/dom/dragndrop.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/http.js": {
            "title": "$:/core/modules/utils/dom/http.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/keyboard.js": {
            "title": "$:/core/modules/utils/dom/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/modal.js": {
            "title": "$:/core/modules/utils/dom/modal.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/notifier.js": {
            "title": "$:/core/modules/utils/dom/notifier.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/popup.js": {
            "title": "$:/core/modules/utils/dom/popup.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n        \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/scroller.js": {
            "title": "$:/core/modules/utils/dom/scroller.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t    srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/edition-info.js": {
            "title": "$:/core/modules/utils/edition-info.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/fakedom.js": {
            "title": "$:/core/modules/utils/fakedom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/filesystem.js": {
            "title": "$:/core/modules/utils/filesystem.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt){\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar newPath = fullPath,\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode){\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode){\n\t\tfullPath = path.resolve(directory, encodeURIComponent(fullPath));\n\t}\n\t// Call hook to allow plugins to modify the final path\n\tfullPath = $tw.hooks.invokeHook(\"th-make-tiddler-path\", newPath, fullPath);\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo, callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\treturn callback(null);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options, callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\treturn $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\treturn callback(null);\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/linkedlist.js": {
            "title": "$:/core/modules/utils/linkedlist.js",
            "text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\tthis.index = Object.create(null);\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = this;\n\tthis.prev = this;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_removeOne(this,value);\n\t}\n};\n\nLinkedList.prototype.push = function(/* values */) {\n\tfor(var i = 0; i < arguments.length; i++) {\n\t\tvar value = arguments[i];\n\t\tvar node = {value: value};\n\t\tvar preexistingNode = this.index[value];\n\t\t_linkToEnd(this,node);\n\t\tif(preexistingNode) {\n\t\t\t// We want to keep pointing to the first instance, but we want\n\t\t\t// to have that instance (or chain of instances) point to the\n\t\t\t// new one.\n\t\t\twhile (preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\tpreexistingNode.copy = node;\n\t\t} else {\n\t\t\tthis.index[value] = node;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tthis.push.apply(this,value);\n\t} else {\n\t\tvar node = _removeOne(this,value);\n\t\tif(!node) {\n\t\t\tnode = {value: value};\n\t\t\tthis.index[value] = node;\n\t\t} else {\n\t\t\t// Put this node at the end of the copy chain.\n\t\t\tvar preexistingNode = node;\n\t\t\twhile(preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\t// The order of these three statements is important,\n\t\t\t// because sometimes preexistingNode == node.\n\t\t\tpreexistingNode.copy = node;\n\t\t\tthis.index[value] = node.copy;\n\t\t\tnode.copy = undefined;\n\t\t}\n\t\t_linkToEnd(this,node);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\tcallback(ptr.value);\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = [];\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\toutput.push(ptr.value);\n\t}\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar node = list.index[value];\n\tif(node) {\n\t\tnode.prev.next = node.next;\n\t\tnode.next.prev = node.prev;\n\t\tlist.length -= 1;\n\t\t// Point index to the next instance of the same value, maybe nothing.\n\t\tlist.index[value] = node.copy;\n\t}\n\treturn node;\n};\n\nfunction _linkToEnd(list,node) {\n\t// Sticks the given node onto the end of the list.\n\tlist.prev.next = node;\n\tnode.prev = list.prev;\n\tlist.prev = node;\n\tnode.next = list;\n\tlist.length += 1;\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n",
            "module-type": "utils",
            "type": "application/javascript"
        },
        "$:/core/modules/utils/logger.js": {
            "title": "$:/core/modules/utils/logger.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/parsetree.js": {
            "title": "$:/core/modules/utils/parsetree.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/performance.js": {
            "title": "$:/core/modules/utils/performance.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/pluginmaker.js": {
            "title": "$:/core/modules/utils/pluginmaker.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/transliterate.js": {
            "title": "$:/core/modules/utils/transliterate.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/utils.js": {
            "title": "$:/core/modules/utils/utils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\",   duration:      365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\",  duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\",    duration:            24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\",   duration:                 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration:                      60 * 1000},\n\t\t{name: \"Seconds\", duration:                           1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&amp;\", < to \"&lt;\", > to \"&gt;\", \" to \"&quot;\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\").replace(/\\\"/mg,\"&quot;\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/'/g, \"\\\\'\")              // single quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(regex, exports.escape);   // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(/\\x08/g, '\\\\b')           // backspace\n\t\t.replace(/\\x0c/g, '\\\\f')           // formfeed\n\t\t.replace(/\\t/g, '\\\\t')             // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n    return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm =  r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/widgets/action-confirm.js": {
            "title": "$:/core/modules/widgets/action-confirm.js",
            "text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-createtiddler.js": {
            "title": "$:/core/modules/widgets/action-createtiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletefield.js": {
            "title": "$:/core/modules/widgets/action-deletefield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletetiddler.js": {
            "title": "$:/core/modules/widgets/action-deletetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-listops.js": {
            "title": "$:/core/modules/widgets/action-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-log.js": {
            "title": "$:/core/modules/widgets/action-log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-navigate.js": {
            "title": "$:/core/modules/widgets/action-navigate.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-popup.js": {
            "title": "$:/core/modules/widgets/action-popup.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-sendmessage.js": {
            "title": "$:/core/modules/widgets/action-sendmessage.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-setfield.js": {
            "title": "$:/core/modules/widgets/action-setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\")  || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/browse.js": {
            "title": "$:/core/modules/widgets/browse.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/button.js": {
            "title": "$:/core/modules/widgets/button.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n    return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/checkbox.js": {
            "title": "$:/core/modules/widgets/checkbox.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/codeblock.js": {
            "title": "$:/core/modules/widgets/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/count.js": {
            "title": "$:/core/modules/widgets/count.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/diff-text.js": {
            "title": "$:/core/modules/widgets/diff-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/draggable.js": {
            "title": "$:/core/modules/widgets/draggable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/droppable.js": {
            "title": "$:/core/modules/widgets/droppable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/dropzone.js": {
            "title": "$:/core/modules/widgets/dropzone.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-binary.js": {
            "title": "$:/core/modules/widgets/edit-binary.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-bitmap.js": {
            "title": "$:/core/modules/widgets/edit-bitmap.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-shortcut.js": {
            "title": "$:/core/modules/widgets/edit-shortcut.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-text.js": {
            "title": "$:/core/modules/widgets/edit-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit.js": {
            "title": "$:/core/modules/widgets/edit.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/element.js": {
            "title": "$:/core/modules/widgets/element.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/encrypt.js": {
            "title": "$:/core/modules/widgets/encrypt.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/entity.js": {
            "title": "$:/core/modules/widgets/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/eventcatcher.js": {
            "title": "$:/core/modules/widgets/eventcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fieldmangler.js": {
            "title": "$:/core/modules/widgets/fieldmangler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fields.js": {
            "title": "$:/core/modules/widgets/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/image.js": {
            "title": "$:/core/modules/widgets/image.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/importvariables.js": {
            "title": "$:/core/modules/widgets/importvariables.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/keyboard.js": {
            "title": "$:/core/modules/widgets/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/link.js": {
            "title": "$:/core/modules/widgets/link.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/linkcatcher.js": {
            "title": "$:/core/modules/widgets/linkcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/list.js": {
            "title": "$:/core/modules/widgets/list.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/log.js": {
            "title": "$:/core/modules/widgets/log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();",
            "type": "application/javascript",
            "module-type": "widget-subclass"
        },
        "$:/core/modules/widgets/macrocall.js": {
            "title": "$:/core/modules/widgets/macrocall.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/navigator.js": {
            "title": "$:/core/modules/widgets/navigator.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\");  \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/password.js": {
            "title": "$:/core/modules/widgets/password.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/qualify.js": {
            "title": "$:/core/modules/widgets/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/radio.js": {
            "title": "$:/core/modules/widgets/radio.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/range.js": {
            "title": "$:/core/modules/widgets/range.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\",   handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\",    handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\",     handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/raw.js": {
            "title": "$:/core/modules/widgets/raw.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/reveal.js": {
            "title": "$:/core/modules/widgets/reveal.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t    defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n        $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/scrollable.js": {
            "title": "$:/core/modules/widgets/scrollable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/select.js": {
            "title": "$:/core/modules/widgets/select.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/set.js": {
            "title": "$:/core/modules/widgets/set.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/text.js": {
            "title": "$:/core/modules/widgets/text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/tiddler.js": {
            "title": "$:/core/modules/widgets/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/transclude.js": {
            "title": "$:/core/modules/widgets/transclude.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/vars.js": {
            "title": "$:/core/modules/widgets/vars.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n  <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/view.js": {
            "title": "$:/core/modules/widgets/view.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/widget.js": {
            "title": "$:/core/modules/widgets/widget.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/wikify.js": {
            "title": "$:/core/modules/widgets/wikify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/wiki-bulkops.js": {
            "title": "$:/core/modules/wiki-bulkops.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/wiki.js": {
            "title": "$:/core/modules/wiki.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type]  || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles.  Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x :  x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t//         indexOf unless we have a new\n\t\t\t\t\t//         position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\")                                       // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\")                                 // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\")                                     // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\")                                         // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\");                                        // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/palettes/Blanca": {
            "title": "$:/palettes/Blanca",
            "name": "Blanca",
            "description": "A clean white palette to let you focus",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Blue": {
            "title": "$:/palettes/Blue",
            "name": "Blue",
            "description": "A blue theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Muted": {
            "title": "$:/palettes/Muted",
            "name": "Muted",
            "description": "Bright tiddlers on a muted background",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastLight": {
            "title": "$:/palettes/ContrastLight",
            "name": "Contrast (Light)",
            "description": "High contrast and unambiguous (light version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastDark": {
            "title": "$:/palettes/ContrastDark",
            "name": "Contrast (Dark)",
            "description": "High contrast and unambiguous (dark version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/CupertinoDark": {
            "title": "$:/palettes/CupertinoDark",
            "tags": "$:/tags/Palette",
            "name": "Cupertino Dark",
            "description": "A macOS inspired dark palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"
        },
        "$:/palettes/DarkPhotos": {
            "title": "$:/palettes/DarkPhotos",
            "created": "20150402111612188",
            "description": "Good with dark photo backgrounds",
            "modified": "20150402112344080",
            "name": "DarkPhotos",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/DesertSand": {
            "title": "$:/palettes/DesertSand",
            "tags": "$:/tags/Palette",
            "name": "Desert Sand",
            "description": "A desert sand palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"
        },
        "$:/palettes/GruvboxDark": {
            "title": "$:/palettes/GruvboxDark",
            "name": "Gruvbox Dark",
            "description": "Retro groove color scheme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "https://github.com/morhetz/gruvbox",
            "text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"
        },
        "$:/palettes/Nord": {
            "title": "$:/palettes/Nord",
            "name": "Nord",
            "description": "An arctic, north-bluish color palette.",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
            "text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"
        },
        "$:/palettes/Rocker": {
            "title": "$:/palettes/Rocker",
            "name": "Rocker",
            "description": "A dark theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarFlare": {
            "title": "$:/palettes/SolarFlare",
            "name": "Solar Flare",
            "description": "Warm, relaxing earth colours",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n    download-foreground: <<colour background>>\n    dragger-foreground: <<colour background>>\n    dropdown-background: <<colour background>>\n    modal-background: <<colour background>>\n    sidebar-foreground-shadow: <<colour background>>\n    tiddler-background: <<colour background>>\n    tiddler-border: <<colour background>>\n    tiddler-link-background: <<colour background>>\n    tab-background-selected: <<colour background>>\n        dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n    dragger-background: <<colour foreground>>\n    tab-foreground: <<colour foreground>>\n        tab-foreground-selected: <<colour tab-foreground>>\n            sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n        sidebar-tab-foreground: <<colour tab-foreground>>\n    sidebar-button-foreground: <<colour foreground>>\n    sidebar-controls-foreground: <<colour foreground>>\n    sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n    alert-muted-foreground: <<colour base01>>\n: base00\n    code-foreground: <<colour base00>>\n    message-foreground: <<colour base00>>\n    tag-foreground: <<colour base00>>\n: base0\n    sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n    muted-foreground: <<colour base1>>\n        blockquote-bar: <<colour muted-foreground>>\n        dropdown-border: <<colour muted-foreground>>\n        sidebar-muted-foreground: <<colour muted-foreground>>\n        tiddler-title-foreground: <<colour muted-foreground>>\n            site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n    modal-footer-background: <<colour base2>>\n    page-background: <<colour base2>>\n        modal-backdrop: <<colour page-background>>\n        notification-background: <<colour page-background>>\n        code-background: <<colour page-background>>\n            code-border: <<colour code-background>>\n        pre-background: <<colour page-background>>\n            pre-border: <<colour pre-background>>\n        sidebar-tab-background-selected: <<colour page-background>>\n    table-header-background: <<colour base2>>\n    tag-background: <<colour base2>>\n    tiddler-editor-background: <<colour base2>>\n    tiddler-info-background: <<colour base2>>\n    tiddler-info-tab-background: <<colour base2>>\n    tab-background: <<colour base2>>\n        dropdown-tab-background: <<colour tab-background>>\n: base3\n    alert-background: <<colour base3>>\n    message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n    alert-highlight: <<colour magenta>>\n: violet\n    external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n    tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n    external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n    primary: <<colour blue-muted>>\n        download-background: <<colour primary>>\n        tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n    modal-footer-border: <<colour tab-border>>\n    modal-header-border: <<colour tab-border>>\n    notification-border: <<colour tab-border>>\n    sidebar-tab-border: <<colour tab-border>>\n    tab-border-selected: <<colour tab-border>>\n        sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n    sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarizedDark": {
            "title": "$:/palettes/SolarizedDark",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision dark colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedDark",
            "text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"
        },
        "$:/palettes/SolarizedLight": {
            "title": "$:/palettes/SolarizedLight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedLight",
            "text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"
        },
        "$:/palettes/SpartanDay": {
            "title": "$:/palettes/SpartanDay",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Cold, spartan day colors",
            "name": "Spartan Day",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
        },
        "$:/palettes/SpartanNight": {
            "title": "$:/palettes/SpartanNight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Dark spartan colors",
            "name": "Spartan Night",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
        },
        "$:/palettes/Twilight": {
            "title": "$:/palettes/Twilight",
            "tags": "$:/tags/Palette",
            "author": "Thomas Elmiger",
            "type": "application/x-tiddler-dictionary",
            "name": "Twilight",
            "description": "Delightful, soft darkness.",
            "text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
        },
        "$:/palettes/Vanilla": {
            "title": "$:/palettes/Vanilla",
            "name": "Vanilla",
            "description": "Pale and unobtrusive",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
        },
        "$:/core/readme": {
            "title": "$:/core/readme",
            "text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
        },
        "$:/library/sjcl.js/license": {
            "title": "$:/library/sjcl.js/license",
            "type": "text/plain",
            "text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
        },
        "$:/core/templates/MOTW.html": {
            "title": "$:/core/templates/MOTW.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com -->&#13;&#10;"
        },
        "$:/core/templates/alltiddlers.template.html": {
            "title": "$:/core/templates/alltiddlers.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
        },
        "$:/core/templates/canonical-uri-external-image": {
            "title": "$:/core/templates/canonical-uri-external-image",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-raw": {
            "title": "$:/core/templates/canonical-uri-external-raw",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-text": {
            "title": "$:/core/templates/canonical-uri-external-text",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
        },
        "$:/core/templates/css-tiddler": {
            "title": "$:/core/templates/css-tiddler",
            "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
        },
        "$:/core/templates/exporters/CsvFile": {
            "title": "$:/core/templates/exporters/CsvFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/CsvFile}}",
            "extension": ".csv",
            "text": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/JsonFile": {
            "title": "$:/core/templates/exporters/JsonFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/JsonFile}}",
            "extension": ".json",
            "text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/StaticRiver": {
            "title": "$:/core/templates/exporters/StaticRiver",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/StaticRiver}}",
            "extension": ".html",
            "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
        },
        "$:/core/templates/exporters/StaticRiver/Content": {
            "title": "$:/core/templates/exporters/StaticRiver/Content",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
        },
        "$:/core/templates/exporters/TidFile": {
            "title": "$:/core/templates/exporters/TidFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/TidFile}}",
            "extension": ".tid",
            "condition": "[<count>compare:lte[1]]",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
        },
        "$:/core/save/all-external-js": {
            "title": "$:/core/save/all-external-js",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
        },
        "$:/core/templates/tiddlywiki5.js": {
            "title": "$:/core/templates/tiddlywiki5.js",
            "text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
        },
        "$:/core/templates/tiddlywiki5.js/tiddlers": {
            "title": "$:/core/templates/tiddlywiki5.js/tiddlers",
            "text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n"
        },
        "$:/core/templates/tiddlywiki5-external-js.html": {
            "title": "$:/core/templates/tiddlywiki5-external-js.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
        },
        "$:/core/templates/html-div-skinny-tiddler": {
            "title": "$:/core/templates/html-div-skinny-tiddler",
            "text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
        },
        "$:/core/templates/html-div-tiddler": {
            "title": "$:/core/templates/html-div-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
        },
        "$:/core/templates/html-tiddler": {
            "title": "$:/core/templates/html-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
        },
        "$:/core/templates/javascript-tiddler": {
            "title": "$:/core/templates/javascript-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
        },
        "$:/core/templates/json-tiddler": {
            "title": "$:/core/templates/json-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
        },
        "$:/core/templates/module-tiddler": {
            "title": "$:/core/templates/module-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
        },
        "$:/core/templates/plain-text-tiddler": {
            "title": "$:/core/templates/plain-text-tiddler",
            "text": "<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/raw-static-tiddler": {
            "title": "$:/core/templates/raw-static-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
        },
        "$:/core/save/all": {
            "title": "$:/core/save/all",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/empty": {
            "title": "$:/core/save/empty",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-all": {
            "title": "$:/core/save/lazy-all",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-images": {
            "title": "$:/core/save/lazy-images",
            "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/templates/server/static.sidebar.wikitext": {
            "title": "$:/core/templates/server/static.sidebar.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
        },
        "$:/core/templates/server/static.tiddler.html": {
            "title": "$:/core/templates/server/static.tiddler.html",
            "text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
        },
        "$:/core/templates/server/static.tiddler.wikitext": {
            "title": "$:/core/templates/server/static.tiddler.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
        },
        "$:/core/templates/single.tiddler.window": {
            "title": "$:/core/templates/single.tiddler.window",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/core/templates/split-recipe": {
            "title": "$:/core/templates/split-recipe",
            "text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
        },
        "$:/core/templates/static-tiddler": {
            "title": "$:/core/templates/static-tiddler",
            "text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
        },
        "$:/core/templates/static.area": {
            "title": "$:/core/templates/static.area",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
        },
        "$:/core/templates/static.content": {
            "title": "$:/core/templates/static.content",
            "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
        },
        "$:/core/templates/static.template.css": {
            "title": "$:/core/templates/static.template.css",
            "text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
        },
        "$:/core/templates/static.template.html": {
            "title": "$:/core/templates/static.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
        },
        "$:/core/templates/static.tiddler.html": {
            "title": "$:/core/templates/static.tiddler.html",
            "text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"
        },
        "$:/core/templates/store.area.template.html": {
            "title": "$:/core/templates/store.area.template.html",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
        },
        "$:/core/templates/tid-tiddler": {
            "title": "$:/core/templates/tid-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/tiddler-metadata": {
            "title": "$:/core/templates/tiddler-metadata",
            "text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
        },
        "$:/core/templates/tiddlywiki5.html": {
            "title": "$:/core/templates/tiddlywiki5.html",
            "text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
        },
        "$:/core/templates/version": {
            "title": "$:/core/templates/version",
            "text": "<<version>>"
        },
        "$:/core/templates/wikified-tiddler": {
            "title": "$:/core/templates/wikified-tiddler",
            "text": "<$transclude />"
        },
        "$:/core/ui/AboveStory/tw2-plugin-check": {
            "title": "$:/core/ui/AboveStory/tw2-plugin-check",
            "tags": "$:/tags/AboveStory",
            "text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/Actions/new-image": {
            "title": "$:/core/ui/Actions/new-image",
            "tags": "$:/tags/Actions",
            "description": "create a new image tiddler",
            "text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-journal": {
            "title": "$:/core/ui/Actions/new-journal",
            "tags": "$:/tags/Actions",
            "description": "create a new journal tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-tiddler": {
            "title": "$:/core/ui/Actions/new-tiddler",
            "tags": "$:/tags/Actions",
            "description": "create a new empty tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter": {
            "title": "$:/core/ui/AdvancedSearch/Filter",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Filter/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Shadows": {
            "title": "$:/core/ui/AdvancedSearch/Shadows",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Shadows/Caption}}",
            "first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]",
            "text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>  filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Standard": {
            "title": "$:/core/ui/AdvancedSearch/Standard",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Standard/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/System": {
            "title": "$:/core/ui/AdvancedSearch/System",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/System/Caption}}",
            "first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/AdvancedSearch": {
            "title": "$:/AdvancedSearch",
            "icon": "$:/core/images/advanced-search-button",
            "color": "#bbb",
            "text": "<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"
        },
        "$:/core/ui/AlertTemplate": {
            "title": "$:/core/ui/AlertTemplate",
            "text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
        },
        "$:/core/ui/BinaryWarning": {
            "title": "$:/core/ui/BinaryWarning",
            "text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
        },
        "$:/core/ui/Components/plugin-info": {
            "title": "$:/core/ui/Components/plugin-info",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
        },
        "$:/core/ui/Components/tag-link": {
            "title": "$:/core/ui/Components/tag-link",
            "text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
        },
        "$:/core/ui/ControlPanel/Advanced": {
            "title": "$:/core/ui/ControlPanel/Advanced",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
            "text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Appearance": {
            "title": "$:/core/ui/ControlPanel/Appearance",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
            "text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Basics": {
            "title": "$:/core/ui/ControlPanel/Basics",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Basics/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
        },
        "$:/core/ui/ControlPanel/EditorTypes": {
            "title": "$:/core/ui/ControlPanel/EditorTypes",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/Info": {
            "title": "$:/core/ui/ControlPanel/Info",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Info/Caption}}",
            "text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/KeyboardShortcuts": {
            "title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/LoadedModules": {
            "title": "$:/core/ui/ControlPanel/LoadedModules",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
        },
        "$:/core/ui/ControlPanel/Modals/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
            "subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
            "text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Palette": {
            "title": "$:/core/ui/ControlPanel/Palette",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Palette/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
        },
        "$:/core/ui/ControlPanel/Parsing": {
            "title": "$:/core/ui/ControlPanel/Parsing",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
            "text": "<<display-server-assets language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
            "text": "<<display-server-assets plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
            "text": "<<display-server-assets theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Updates": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
            "caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
            "text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"&#91;&#91;<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
            "text": "<<plugin-table language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
            "text": "<<plugin-table plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
            "text": "<<plugin-table theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"
        },
        "$:/core/ui/ControlPanel/Saving/DownloadSaver": {
            "title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Saving/General": {
            "title": "$:/core/ui/ControlPanel/Saving/General",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
            "list-before": "",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Saving/GitHub": {
            "title": "$:/core/ui/ControlPanel/Saving/GitHub",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/GitLab": {
            "title": "$:/core/ui/ControlPanel/Saving/GitLab",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/TiddlySpot": {
            "title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>>  |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"
        },
        "$:/core/ui/ControlPanel/Saving/Gitea": {
            "title": "$:/core/ui/ControlPanel/Saving/Gitea",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
        },
        "$:/core/ui/ControlPanel/Saving": {
            "title": "$:/core/ui/ControlPanel/Saving",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Saving/Caption}}",
            "text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n"
        },
        "$:/core/buttonstyles/Borderless": {
            "title": "$:/core/buttonstyles/Borderless",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
            "text": "tc-btn-invisible"
        },
        "$:/core/buttonstyles/Boxed": {
            "title": "$:/core/buttonstyles/Boxed",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
            "text": "tc-btn-boxed"
        },
        "$:/core/buttonstyles/Rounded": {
            "title": "$:/core/buttonstyles/Rounded",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
            "text": "tc-btn-rounded"
        },
        "$:/core/ui/ControlPanel/Settings/CamelCase": {
            "title": "$:/core/ui/ControlPanel/Settings/CamelCase",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
            "title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
            "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n  <option value=\"above\"><<lingo \"OpenAbove\">></option>\n  <option value=\"below\"><<lingo \"OpenBelow\">></option>\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/MissingLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationHistory": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
            "title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/TitleLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings": {
            "title": "$:/core/ui/ControlPanel/Settings",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Settings/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ControlPanel/StoryView": {
            "title": "$:/core/ui/ControlPanel/StoryView",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
            "text": "{{$:/snippets/viewswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/Stylesheets": {
            "title": "$:/core/ui/ControlPanel/Stylesheets",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
        },
        "$:/core/ui/ControlPanel/Theme": {
            "title": "$:/core/ui/ControlPanel/Theme",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Theme/Caption}}",
            "text": "{{$:/snippets/themeswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/TiddlerFields": {
            "title": "$:/core/ui/ControlPanel/TiddlerFields",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/PageControls": {
            "title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars": {
            "title": "$:/core/ui/ControlPanel/Toolbars",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
            "text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"
        },
        "$:/ControlPanel": {
            "title": "$:/ControlPanel",
            "icon": "$:/core/images/options-button",
            "color": "#bbb",
            "text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"
        },
        "$:/core/ui/DefaultSearchResultList": {
            "title": "$:/core/ui/DefaultSearchResultList",
            "tags": "$:/tags/SearchResults",
            "caption": "{{$:/language/Search/DefaultResults/Caption}}",
            "first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]",
            "second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]",
            "text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-current": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from current",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from shadow (if any)",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/output": {
            "title": "$:/core/ui/EditTemplate/body/preview/output",
            "tags": "$:/tags/EditPreview",
            "caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
            "text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
        },
        "$:/state/showeditpreview": {
            "title": "$:/state/showeditpreview",
            "text": "no"
        },
        "$:/core/ui/EditTemplate/body/editor": {
            "title": "$:/core/ui/EditTemplate/body/editor",
            "text": "<$edit\n\n  field=\"text\"\n  class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n  tabindex={{$:/config/EditTabIndex}}\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n  cancelPopups=\"yes\"\n\n><$set\n\n  name=\"targetTiddler\"\n  value=<<currentTiddler>>\n\n><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n  type=\"nomatch\"\n  state=<<config-visibility-title>>\n  text=\"hide\"\n  class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n  tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n  mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
        },
        "$:/core/ui/EditTemplate/body/toolbar/button": {
            "title": "$:/core/ui/EditTemplate/body/toolbar/button",
            "text": "\\define toolbar-button-icon()\n<$list\n\n  filter=\"[all[current]!has[custom-icon]]\"\n  variable=\"no-custom-icon\"\n\n><$transclude\n\n  tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n  filter={{!!condition}}\n  variable=\"list-condition\"\n\n><$wikify\n\n  name=\"tooltip-text\"\n  text=<<toolbar-button-tooltip>>\n  mode=\"inline\"\n  output=\"text\"\n\n><$list\n\n  filter=\"[all[current]!has[dropdown]]\"\n  variable=\"no-dropdown\"\n\n><$button\n\n  class=\"tc-btn-invisible $(buttonClasses)$\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$list><$list\n\n  filter=\"[all[current]has[dropdown]]\"\n  variable=\"dropdown\"\n\n><$set\n\n  name=\"dropdown-state\"\n  value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n  popup=<<dropdown-state>>\n  class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n  selectedClass=\"tc-selected\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button><$reveal\n\n  state=<<dropdown-state>>\n  type=\"popup\"\n  position=\"below\"\n  animate=\"yes\"\n  tag=\"span\"\n\n><div\n\n  class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n  tiddler={{!!dropdown}}\n  mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n  name=\"buttonClasses\"\n  value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
        },
        "$:/core/ui/EditTemplate/body": {
            "title": "$:/core/ui/EditTemplate/body",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/EditTemplate/controls": {
            "title": "$:/core/ui/EditTemplate/controls",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
        },
        "$:/core/ui/EditTemplate/fields": {
            "title": "$:/core/ui/EditTemplate/fields",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\"  variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\n"
        },
        "$:/core/ui/EditTemplate/shadow": {
            "title": "$:/core/ui/EditTemplate/shadow",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
        },
        "$:/core/ui/EditTemplate/tags": {
            "title": "$:/core/ui/EditTemplate/tags",
            "tags": "$:/tags/EditTemplate",
            "text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate/title": {
            "title": "$:/core/ui/EditTemplate/title",
            "tags": "$:/tags/EditTemplate",
            "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/EditTemplate/type": {
            "title": "$:/core/ui/EditTemplate/type",
            "tags": "$:/tags/EditTemplate",
            "first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate": {
            "title": "$:/core/ui/EditTemplate",
            "text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
        },
        "$:/core/ui/Buttons/cancel": {
            "title": "$:/core/ui/Buttons/cancel",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
            "description": "{{$:/language/Buttons/Cancel/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/delete": {
            "title": "$:/core/ui/Buttons/delete",
            "tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
            "caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
            "description": "{{$:/language/Buttons/Delete/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/save": {
            "title": "$:/core/ui/Buttons/save",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
            "description": "{{$:/language/Buttons/Save/Hint}}",
            "text": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
        },
        "$:/core/ui/EditorToolbar/bold": {
            "title": "$:/core/ui/EditorToolbar/bold",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/bold",
            "caption": "{{$:/language/Buttons/Bold/Caption}}",
            "description": "{{$:/language/Buttons/Bold/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((bold))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/clear-dropdown": {
            "title": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/clear": {
            "title": "$:/core/ui/EditorToolbar/clear",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/erase",
            "caption": "{{$:/language/Buttons/Clear/Caption}}",
            "description": "{{$:/language/Buttons/Clear/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/editor-height-dropdown": {
            "title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
        },
        "$:/core/ui/EditorToolbar/editor-height": {
            "title": "$:/core/ui/EditorToolbar/editor-height",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/fixed-height",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
            "description": "{{$:/language/Buttons/EditorHeight/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/excise-dropdown": {
            "title": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/excise": {
            "title": "$:/core/ui/EditorToolbar/excise",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/excise",
            "caption": "{{$:/language/Buttons/Excise/Caption}}",
            "description": "{{$:/language/Buttons/Excise/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
            "shortcuts": "((excise))",
            "dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/heading-1": {
            "title": "$:/core/ui/EditorToolbar/heading-1",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-1",
            "caption": "{{$:/language/Buttons/Heading1/Caption}}",
            "description": "{{$:/language/Buttons/Heading1/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((heading-1))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-2": {
            "title": "$:/core/ui/EditorToolbar/heading-2",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-2",
            "caption": "{{$:/language/Buttons/Heading2/Caption}}",
            "description": "{{$:/language/Buttons/Heading2/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-2))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-3": {
            "title": "$:/core/ui/EditorToolbar/heading-3",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-3",
            "caption": "{{$:/language/Buttons/Heading3/Caption}}",
            "description": "{{$:/language/Buttons/Heading3/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-3))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/core/ui/EditorToolbar/heading-4",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-4",
            "caption": "{{$:/language/Buttons/Heading4/Caption}}",
            "description": "{{$:/language/Buttons/Heading4/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-4))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/core/ui/EditorToolbar/heading-5",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-5",
            "caption": "{{$:/language/Buttons/Heading5/Caption}}",
            "description": "{{$:/language/Buttons/Heading5/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-5))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/core/ui/EditorToolbar/heading-6",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-6",
            "caption": "{{$:/language/Buttons/Heading6/Caption}}",
            "description": "{{$:/language/Buttons/Heading6/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-6))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/italic": {
            "title": "$:/core/ui/EditorToolbar/italic",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/italic",
            "caption": "{{$:/language/Buttons/Italic/Caption}}",
            "description": "{{$:/language/Buttons/Italic/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((italic))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/line-width-dropdown": {
            "title": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/line-width": {
            "title": "$:/core/ui/EditorToolbar/line-width",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/line-width",
            "caption": "{{$:/language/Buttons/LineWidth/Caption}}",
            "description": "{{$:/language/Buttons/LineWidth/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"
        },
        "$:/core/ui/EditorToolbar/link-dropdown": {
            "title": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/link": {
            "title": "$:/core/ui/EditorToolbar/link",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/link",
            "caption": "{{$:/language/Buttons/Link/Caption}}",
            "description": "{{$:/language/Buttons/Link/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((link))",
            "dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/linkify": {
            "title": "$:/core/ui/EditorToolbar/linkify",
            "caption": "{{$:/language/Buttons/Linkify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Linkify/Hint}}",
            "icon": "$:/core/images/linkify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((linkify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-bullet": {
            "title": "$:/core/ui/EditorToolbar/list-bullet",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-bullet",
            "caption": "{{$:/language/Buttons/ListBullet/Caption}}",
            "description": "{{$:/language/Buttons/ListBullet/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-bullet))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-number": {
            "title": "$:/core/ui/EditorToolbar/list-number",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-number",
            "caption": "{{$:/language/Buttons/ListNumber/Caption}}",
            "description": "{{$:/language/Buttons/ListNumber/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-number))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-block": {
            "title": "$:/core/ui/EditorToolbar/mono-block",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-block",
            "caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
            "description": "{{$:/language/Buttons/MonoBlock/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((mono-block))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-line": {
            "title": "$:/core/ui/EditorToolbar/mono-line",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-line",
            "caption": "{{$:/language/Buttons/MonoLine/Caption}}",
            "description": "{{$:/language/Buttons/MonoLine/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((mono-line))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/more-dropdown": {
            "title": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/more": {
            "title": "$:/core/ui/EditorToolbar/more",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/down-arrow",
            "caption": "{{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "condition": "[<targetTiddler>]",
            "dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/opacity-dropdown": {
            "title": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/opacity": {
            "title": "$:/core/ui/EditorToolbar/opacity",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/opacity",
            "caption": "{{$:/language/Buttons/Opacity/Caption}}",
            "description": "{{$:/language/Buttons/Opacity/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
        },
        "$:/core/ui/EditorToolbar/paint-dropdown": {
            "title": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/paint": {
            "title": "$:/core/ui/EditorToolbar/paint",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/paint",
            "caption": "{{$:/language/Buttons/Paint/Caption}}",
            "description": "{{$:/language/Buttons/Paint/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/picture-dropdown": {
            "title": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/picture": {
            "title": "$:/core/ui/EditorToolbar/picture",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/picture",
            "caption": "{{$:/language/Buttons/Picture/Caption}}",
            "description": "{{$:/language/Buttons/Picture/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((picture))",
            "dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/preview-type-dropdown": {
            "title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
            "text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/preview-type": {
            "title": "$:/core/ui/EditorToolbar/preview-type",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/chevron-down",
            "caption": "{{$:/language/Buttons/PreviewType/Caption}}",
            "description": "{{$:/language/Buttons/PreviewType/Hint}}",
            "condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
            "button-classes": "tc-text-editor-toolbar-item-adjunct",
            "dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
        },
        "$:/core/ui/EditorToolbar/preview": {
            "title": "$:/core/ui/EditorToolbar/preview",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/preview-open",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/Preview/Caption}}",
            "description": "{{$:/language/Buttons/Preview/Hint}}",
            "condition": "[<targetTiddler>]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((preview))",
            "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/quote": {
            "title": "$:/core/ui/EditorToolbar/quote",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/quote",
            "caption": "{{$:/language/Buttons/Quote/Caption}}",
            "description": "{{$:/language/Buttons/Quote/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((quote))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/rotate-left": {
            "title": "$:/core/ui/EditorToolbar/rotate-left",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/rotate-left",
            "caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
            "description": "{{$:/language/Buttons/RotateLeft/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/size-dropdown": {
            "title": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> &times; <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/size": {
            "title": "$:/core/ui/EditorToolbar/size",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/size",
            "caption": "{{$:/language/Buttons/Size/Caption}}",
            "description": "{{$:/language/Buttons/Size/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/stamp-dropdown": {
            "title": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
        },
        "$:/core/ui/EditorToolbar/stamp": {
            "title": "$:/core/ui/EditorToolbar/stamp",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/stamp",
            "caption": "{{$:/language/Buttons/Stamp/Caption}}",
            "description": "{{$:/language/Buttons/Stamp/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "shortcuts": "((stamp))",
            "dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/strikethrough": {
            "title": "$:/core/ui/EditorToolbar/strikethrough",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/strikethrough",
            "caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
            "description": "{{$:/language/Buttons/Strikethrough/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((strikethrough))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/subscript": {
            "title": "$:/core/ui/EditorToolbar/subscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/subscript",
            "caption": "{{$:/language/Buttons/Subscript/Caption}}",
            "description": "{{$:/language/Buttons/Subscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((subscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/superscript": {
            "title": "$:/core/ui/EditorToolbar/superscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/superscript",
            "caption": "{{$:/language/Buttons/Superscript/Caption}}",
            "description": "{{$:/language/Buttons/Superscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((superscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/transcludify": {
            "title": "$:/core/ui/EditorToolbar/transcludify",
            "caption": "{{$:/language/Buttons/Transcludify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Transcludify/Hint}}",
            "icon": "$:/core/images/transcludify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((transcludify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/underline": {
            "title": "$:/core/ui/EditorToolbar/underline",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/underline",
            "caption": "{{$:/language/Buttons/Underline/Caption}}",
            "description": "{{$:/language/Buttons/Underline/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((underline))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
        },
        "$:/core/Filters/AllTags": {
            "title": "$:/core/Filters/AllTags",
            "tags": "$:/tags/Filter",
            "filter": "[tags[]!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTags}}",
            "text": ""
        },
        "$:/core/Filters/AllTiddlers": {
            "title": "$:/core/Filters/AllTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/Drafts": {
            "title": "$:/core/Filters/Drafts",
            "tags": "$:/tags/Filter",
            "filter": "[has[draft.of]sort[title]]",
            "description": "{{$:/language/Filters/Drafts}}",
            "text": ""
        },
        "$:/core/Filters/Missing": {
            "title": "$:/core/Filters/Missing",
            "tags": "$:/tags/Filter",
            "filter": "[all[missing]sort[title]]",
            "description": "{{$:/language/Filters/Missing}}",
            "text": ""
        },
        "$:/core/Filters/Orphans": {
            "title": "$:/core/Filters/Orphans",
            "tags": "$:/tags/Filter",
            "filter": "[all[orphans]sort[title]]",
            "description": "{{$:/language/Filters/Orphans}}",
            "text": ""
        },
        "$:/core/Filters/OverriddenShadowTiddlers": {
            "title": "$:/core/Filters/OverriddenShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[shadow]]",
            "description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentSystemTiddlers": {
            "title": "$:/core/Filters/RecentSystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentSystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentTiddlers": {
            "title": "$:/core/Filters/RecentTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/SessionTiddlers": {
            "title": "$:/core/Filters/SessionTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[haschanged[]]",
            "description": "{{$:/language/Filters/SessionTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/ShadowTiddlers": {
            "title": "$:/core/Filters/ShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows]sort[title]]",
            "description": "{{$:/language/Filters/ShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/StoryList": {
            "title": "$:/core/Filters/StoryList",
            "tags": "$:/tags/Filter",
            "filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
            "description": "{{$:/language/Filters/StoryList}}",
            "text": ""
        },
        "$:/core/Filters/SystemTags": {
            "title": "$:/core/Filters/SystemTags",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTags}}",
            "text": ""
        },
        "$:/core/Filters/SystemTiddlers": {
            "title": "$:/core/Filters/SystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/TypedTiddlers": {
            "title": "$:/core/Filters/TypedTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Filters/TypedTiddlers}}",
            "text": ""
        },
        "$:/core/ui/ImportListing": {
            "title": "$:/core/ui/ImportListing",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>>  default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Diff": {
            "title": "$:/core/ui/ImportPreviews/Diff",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Diff}}",
            "text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
        },
        "$:/core/ui/ImportPreviews/DiffFields": {
            "title": "$:/core/ui/ImportPreviews/DiffFields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
            "text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
        },
        "$:/core/ui/ImportPreviews/Fields": {
            "title": "$:/core/ui/ImportPreviews/Fields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Fields}}",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Text": {
            "title": "$:/core/ui/ImportPreviews/Text",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Text}}",
            "text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
        },
        "$:/core/ui/ImportPreviews/TextRaw": {
            "title": "$:/core/ui/ImportPreviews/TextRaw",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
            "text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
        },
        "$:/core/ui/KeyboardShortcuts/advanced-search": {
            "title": "$:/core/ui/KeyboardShortcuts/advanced-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((advanced-search))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/change-sidebar-layout": {
            "title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((change-sidebar-layout))",
            "text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-image": {
            "title": "$:/core/ui/KeyboardShortcuts/new-image",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-image))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-journal": {
            "title": "$:/core/ui/KeyboardShortcuts/new-journal",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-journal))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-tiddler": {
            "title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-tiddler))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/save-wiki": {
            "title": "$:/core/ui/KeyboardShortcuts/save-wiki",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((save-wiki))",
            "text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"
        },
        "$:/core/ui/KeyboardShortcuts/sidebar-search": {
            "title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((sidebar-search))",
            "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
        },
        "$:/core/ui/KeyboardShortcuts/switcher": {
            "title": "$:/core/ui/KeyboardShortcuts/switcher",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((layout-switcher))",
            "text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"
        },
        "$:/core/ui/KeyboardShortcuts/toggle-sidebar": {
            "title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((toggle-sidebar))",
            "text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
        },
        "$:/snippets/LayoutSwitcher": {
            "title": "$:/snippets/LayoutSwitcher",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}",
            "text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/core/ui/ListItemTemplate": {
            "title": "$:/core/ui/ListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
        },
        "$:/Manager/ItemMain/Fields": {
            "title": "$:/Manager/ItemMain/Fields",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/Fields}}",
            "text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/Manager/ItemMain/RawText": {
            "title": "$:/Manager/ItemMain/RawText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/RawText}}",
            "text": "<pre><code><$view/></code></pre>\n"
        },
        "$:/Manager/ItemMain/WikifiedText": {
            "title": "$:/Manager/ItemMain/WikifiedText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/WikifiedText}}",
            "text": "<$transclude mode=\"block\"/>\n"
        },
        "$:/Manager/ItemSidebar/Colour": {
            "title": "$:/Manager/ItemSidebar/Colour",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Colour}}",
            "text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Icon": {
            "title": "$:/Manager/ItemSidebar/Icon",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Icon}}",
            "text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tags": {
            "title": "$:/Manager/ItemSidebar/Tags",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tags}}",
            "text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tools": {
            "title": "$:/Manager/ItemSidebar/Tools",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tools}}",
            "text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
        },
        "$:/Manager": {
            "title": "$:/Manager",
            "icon": "$:/core/images/list",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
        },
        "$:/core/ui/MissingTemplate": {
            "title": "$:/core/ui/MissingTemplate",
            "text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
        },
        "$:/core/ui/MoreSideBar/All": {
            "title": "$:/core/ui/MoreSideBar/All",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/All/Caption}}",
            "text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Drafts": {
            "title": "$:/core/ui/MoreSideBar/Drafts",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Drafts/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Explorer": {
            "title": "$:/core/ui/MoreSideBar/Explorer",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Explorer/Caption}}",
            "text": "<<tree \"$:/\">>\n"
        },
        "$:/core/ui/MoreSideBar/Missing": {
            "title": "$:/core/ui/MoreSideBar/Missing",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Missing/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Orphans": {
            "title": "$:/core/ui/MoreSideBar/Orphans",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Orphans/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Recent": {
            "title": "$:/core/ui/MoreSideBar/Recent",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Shadows": {
            "title": "$:/core/ui/MoreSideBar/Shadows",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Shadows/Caption}}",
            "text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/System": {
            "title": "$:/core/ui/MoreSideBar/System",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/System/Caption}}",
            "text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Tags": {
            "title": "$:/core/ui/MoreSideBar/Tags",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Tags/Caption}}",
            "text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
        },
        "$:/core/ui/MoreSideBar/Types": {
            "title": "$:/core/ui/MoreSideBar/Types",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Types/Caption}}",
            "text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Languages": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Languages",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Theme": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Theme",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/Buttons/advanced-search": {
            "title": "$:/core/ui/Buttons/advanced-search",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
            "description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
            "text": "\\whitespace trim\n\\define advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/close-all": {
            "title": "$:/core/ui/Buttons/close-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
            "description": "{{$:/language/Buttons/CloseAll/Hint}}",
            "text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/control-panel": {
            "title": "$:/core/ui/Buttons/control-panel",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
            "description": "{{$:/language/Buttons/ControlPanel/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/encryption": {
            "title": "$:/core/ui/Buttons/encryption",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
            "description": "{{$:/language/Buttons/Encryption/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/export-page": {
            "title": "$:/core/ui/Buttons/export-page",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
            "description": "{{$:/language/Buttons/ExportPage/Hint}}",
            "text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
        },
        "$:/core/ui/Buttons/fold-all": {
            "title": "$:/core/ui/Buttons/fold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
            "description": "{{$:/language/Buttons/FoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/full-screen": {
            "title": "$:/core/ui/Buttons/full-screen",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
            "description": "{{$:/language/Buttons/FullScreen/Hint}}",
            "text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/home": {
            "title": "$:/core/ui/Buttons/home",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
            "description": "{{$:/language/Buttons/Home/Hint}}",
            "text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/import": {
            "title": "$:/core/ui/Buttons/import",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
            "description": "{{$:/language/Buttons/Import/Hint}}",
            "text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
        },
        "$:/core/ui/Buttons/language": {
            "title": "$:/core/ui/Buttons/language",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
            "description": "{{$:/language/Buttons/Language/Hint}}",
            "text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/manager": {
            "title": "$:/core/ui/Buttons/manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
            "description": "{{$:/language/Buttons/Manager/Hint}}",
            "text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/core/ui/Buttons/more-page-actions",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-image": {
            "title": "$:/core/ui/Buttons/new-image",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
            "description": "{{$:/language/Buttons/NewImage/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/new-journal": {
            "title": "$:/core/ui/Buttons/new-journal",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
            "description": "{{$:/language/Buttons/NewJournal/Hint}}",
            "text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
        },
        "$:/core/ui/Buttons/new-tiddler": {
            "title": "$:/core/ui/Buttons/new-tiddler",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
            "description": "{{$:/language/Buttons/NewTiddler/Hint}}",
            "text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/palette": {
            "title": "$:/core/ui/Buttons/palette",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
            "description": "{{$:/language/Buttons/Palette/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/print": {
            "title": "$:/core/ui/Buttons/print",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
            "description": "{{$:/language/Buttons/Print/Hint}}",
            "text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/refresh": {
            "title": "$:/core/ui/Buttons/refresh",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
            "description": "{{$:/language/Buttons/Refresh/Hint}}",
            "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/save-wiki": {
            "title": "$:/core/ui/Buttons/save-wiki",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
            "description": "{{$:/language/Buttons/SaveWiki/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
        },
        "$:/core/ui/Buttons/storyview": {
            "title": "$:/core/ui/Buttons/storyview",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
            "description": "{{$:/language/Buttons/StoryView/Hint}}",
            "text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/tag-manager": {
            "title": "$:/core/ui/Buttons/tag-manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
            "description": "{{$:/language/Buttons/TagManager/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/theme": {
            "title": "$:/core/ui/Buttons/theme",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
            "description": "{{$:/language/Buttons/Theme/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/timestamp": {
            "title": "$:/core/ui/Buttons/timestamp",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
            "description": "{{$:/language/Buttons/Timestamp/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/unfold-all": {
            "title": "$:/core/ui/Buttons/unfold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
            "description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/PageTemplate/pagecontrols": {
            "title": "$:/core/ui/PageTemplate/pagecontrols",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
        },
        "$:/core/ui/PageStylesheet": {
            "title": "$:/core/ui/PageStylesheet",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/PageTemplate/alerts": {
            "title": "$:/core/ui/PageTemplate/alerts",
            "tags": "$:/tags/PageTemplate",
            "text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
        },
        "$:/core/ui/PageTemplate/drafts": {
            "title": "$:/core/ui/PageTemplate/drafts",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/PageTemplate/pluginreloadwarning": {
            "title": "$:/core/ui/PageTemplate/pluginreloadwarning",
            "tags": "$:/tags/PageTemplate",
            "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/PageTemplate/sidebar": {
            "title": "$:/core/ui/PageTemplate/sidebar",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
        },
        "$:/core/ui/PageTemplate/story": {
            "title": "$:/core/ui/PageTemplate/story",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
        },
        "$:/core/ui/PageTemplate/topleftbar": {
            "title": "$:/core/ui/PageTemplate/topleftbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate/toprightbar": {
            "title": "$:/core/ui/PageTemplate/toprightbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate": {
            "title": "$:/core/ui/PageTemplate",
            "name": "{{$:/language/PageTemplate/Name}}",
            "description": "{{$:/language/PageTemplate/Description}}",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/PaletteManager": {
            "title": "$:/PaletteManager",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n"
        },
        "$:/core/ui/PluginInfo": {
            "title": "$:/core/ui/PluginInfo",
            "text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
        },
        "$:/core/ui/PluginInfo/Default/contents": {
            "title": "$:/core/ui/PluginInfo/Default/contents",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
        },
        "$:/core/ui/PluginListItemTemplate": {
            "title": "$:/core/ui/PluginListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
        },
        "$:/core/ui/RootTemplate": {
            "title": "$:/core/ui/RootTemplate",
            "text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"
        },
        "$:/core/ui/SearchResults": {
            "title": "$:/core/ui/SearchResults",
            "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n"
        },
        "$:/core/ui/SideBar/More": {
            "title": "$:/core/ui/SideBar/More",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/More/Caption}}",
            "text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"
        },
        "$:/core/ui/SideBar/Open": {
            "title": "$:/core/ui/SideBar/Open",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Open/Caption}}",
            "text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
        },
        "$:/core/ui/SideBar/Recent": {
            "title": "$:/core/ui/SideBar/Recent",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/SideBar/Tools": {
            "title": "$:/core/ui/SideBar/Tools",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/SideBarLists": {
            "title": "$:/core/ui/SideBarLists",
            "text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
        },
        "$:/core/ui/SideBarSegments/page-controls": {
            "title": "$:/core/ui/SideBarSegments/page-controls",
            "tags": "$:/tags/SideBarSegment",
            "text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
        },
        "$:/core/ui/SideBarSegments/search": {
            "title": "$:/core/ui/SideBarSegments/search",
            "tags": "$:/tags/SideBarSegment",
            "text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-subtitle": {
            "title": "$:/core/ui/SideBarSegments/site-subtitle",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-title": {
            "title": "$:/core/ui/SideBarSegments/site-title",
            "tags": "$:/tags/SideBarSegment",
            "text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
        },
        "$:/core/ui/SideBarSegments/tabs": {
            "title": "$:/core/ui/SideBarSegments/tabs",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"
        },
        "$:/core/ui/SwitcherModal": {
            "title": "$:/core/ui/SwitcherModal",
            "subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>",
            "class": "tc-modal-centered",
            "text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"
        },
        "$:/TagManager": {
            "title": "$:/TagManager",
            "icon": "$:/core/images/tag-button",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TagPickerTagTemplate": {
            "title": "$:/core/ui/TagPickerTagTemplate",
            "text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n"
        },
        "$:/core/ui/TagTemplate": {
            "title": "$:/core/ui/TagTemplate",
            "text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
        },
        "$:/core/ui/TiddlerFieldTemplate": {
            "title": "$:/core/ui/TiddlerFieldTemplate",
            "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
        },
        "$:/core/ui/TiddlerFields": {
            "title": "$:/core/ui/TiddlerFields",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced": {
            "title": "$:/core/ui/TiddlerInfo/Advanced",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Fields": {
            "title": "$:/core/ui/TiddlerInfo/Fields",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
            "text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/List": {
            "title": "$:/core/ui/TiddlerInfo/List",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/List/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Listed": {
            "title": "$:/core/ui/TiddlerInfo/Listed",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/References": {
            "title": "$:/core/ui/TiddlerInfo/References",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/References/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
        },
        "$:/core/ui/TiddlerInfo/Tagging": {
            "title": "$:/core/ui/TiddlerInfo/Tagging",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Tools": {
            "title": "$:/core/ui/TiddlerInfo/Tools",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo": {
            "title": "$:/core/ui/TiddlerInfo",
            "text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"
        },
        "$:/core/ui/TopBar/menu": {
            "title": "$:/core/ui/TopBar/menu",
            "tags": "$:/tags/TopRightBar",
            "text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
        },
        "$:/core/ui/UntaggedTemplate": {
            "title": "$:/core/ui/UntaggedTemplate",
            "text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/body": {
            "title": "$:/core/ui/ViewTemplate/body",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/classic": {
            "title": "$:/core/ui/ViewTemplate/classic",
            "tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/import": {
            "title": "$:/core/ui/ViewTemplate/import",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/plugin": {
            "title": "$:/core/ui/ViewTemplate/plugin",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>"
        },
        "$:/core/ui/ViewTemplate/subtitle": {
            "title": "$:/core/ui/ViewTemplate/subtitle",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/tags": {
            "title": "$:/core/ui/ViewTemplate/tags",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/title": {
            "title": "$:/core/ui/ViewTemplate/title",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
        },
        "$:/core/ui/ViewTemplate/unfold": {
            "title": "$:/core/ui/ViewTemplate/unfold",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate": {
            "title": "$:/core/ui/ViewTemplate",
            "text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
        },
        "$:/core/ui/Buttons/clone": {
            "title": "$:/core/ui/Buttons/clone",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
            "description": "{{$:/language/Buttons/Clone/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close-others": {
            "title": "$:/core/ui/Buttons/close-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
            "description": "{{$:/language/Buttons/CloseOthers/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close": {
            "title": "$:/core/ui/Buttons/close",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
            "description": "{{$:/language/Buttons/Close/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/edit": {
            "title": "$:/core/ui/Buttons/edit",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
            "description": "{{$:/language/Buttons/Edit/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/core/ui/Buttons/export-tiddler",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
            "description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
            "text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
        },
        "$:/core/ui/Buttons/fold-bar": {
            "title": "$:/core/ui/Buttons/fold-bar",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
            "description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
            "text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
        },
        "$:/core/ui/Buttons/fold-others": {
            "title": "$:/core/ui/Buttons/fold-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
            "description": "{{$:/language/Buttons/FoldOthers/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/fold": {
            "title": "$:/core/ui/Buttons/fold",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
            "description": "{{$:/language/Buttons/Fold/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/info": {
            "title": "$:/core/ui/Buttons/info",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
            "description": "{{$:/language/Buttons/Info/Hint}}",
            "text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
        },
        "$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/core/ui/Buttons/more-tiddler-actions",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-here": {
            "title": "$:/core/ui/Buttons/new-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
            "description": "{{$:/language/Buttons/NewHere/Hint}}",
            "text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
        },
        "$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/core/ui/Buttons/new-journal-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
            "description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
            "text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
        },
        "$:/core/ui/Buttons/open-window": {
            "title": "$:/core/ui/Buttons/open-window",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
            "description": "{{$:/language/Buttons/OpenWindow/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permalink": {
            "title": "$:/core/ui/Buttons/permalink",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
            "description": "{{$:/language/Buttons/Permalink/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permaview": {
            "title": "$:/core/ui/Buttons/permaview",
            "tags": "$:/tags/ViewToolbar $:/tags/PageControls",
            "caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
            "description": "{{$:/language/Buttons/Permaview/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/DefaultTiddlers": {
            "title": "$:/DefaultTiddlers",
            "text": "GettingStarted\n"
        },
        "$:/temp/advancedsearch": {
            "title": "$:/temp/advancedsearch",
            "text": ""
        },
        "$:/snippets/allfields": {
            "title": "$:/snippets/allfields",
            "text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
        },
        "$:/config/AnimationDuration": {
            "title": "$:/config/AnimationDuration",
            "text": "400"
        },
        "$:/config/AutoFocus": {
            "title": "$:/config/AutoFocus",
            "text": "title"
        },
        "$:/config/AutoSave": {
            "title": "$:/config/AutoSave",
            "text": "yes"
        },
        "$:/config/BitmapEditor/Colour": {
            "title": "$:/config/BitmapEditor/Colour",
            "text": "#444"
        },
        "$:/config/BitmapEditor/ImageSizes": {
            "title": "$:/config/BitmapEditor/ImageSizes",
            "text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
        },
        "$:/config/BitmapEditor/LineWidth": {
            "title": "$:/config/BitmapEditor/LineWidth",
            "text": "3px"
        },
        "$:/config/BitmapEditor/LineWidths": {
            "title": "$:/config/BitmapEditor/LineWidths",
            "text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
        },
        "$:/config/BitmapEditor/Opacities": {
            "title": "$:/config/BitmapEditor/Opacities",
            "text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
        },
        "$:/config/BitmapEditor/Opacity": {
            "title": "$:/config/BitmapEditor/Opacity",
            "text": "1.0"
        },
        "$:/config/DefaultMoreSidebarTab": {
            "title": "$:/config/DefaultMoreSidebarTab",
            "text": "$:/core/ui/MoreSideBar/Tags"
        },
        "$:/config/DefaultSidebarTab": {
            "title": "$:/config/DefaultSidebarTab",
            "text": "$:/core/ui/SideBar/Open"
        },
        "$:/config/DownloadSaver/AutoSave": {
            "title": "$:/config/DownloadSaver/AutoSave",
            "text": "no"
        },
        "$:/config/Drafts/TypingTimeout": {
            "title": "$:/config/Drafts/TypingTimeout",
            "text": "400"
        },
        "$:/config/EditMode/fieldname-filter": {
            "title": "$:/config/EditMode/fieldname-filter",
            "first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type",
            "second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"
        },
        "$:/config/EditTabIndex": {
            "title": "$:/config/EditTabIndex",
            "text": "1\n"
        },
        "$:/config/EditTemplateFields/Visibility/title": {
            "title": "$:/config/EditTemplateFields/Visibility/title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/tags": {
            "title": "$:/config/EditTemplateFields/Visibility/tags",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/text": {
            "title": "$:/config/EditTemplateFields/Visibility/text",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/creator": {
            "title": "$:/config/EditTemplateFields/Visibility/creator",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/created": {
            "title": "$:/config/EditTemplateFields/Visibility/created",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modified": {
            "title": "$:/config/EditTemplateFields/Visibility/modified",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modifier": {
            "title": "$:/config/EditTemplateFields/Visibility/modifier",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/type": {
            "title": "$:/config/EditTemplateFields/Visibility/type",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.title": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.of": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.of",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/revision": {
            "title": "$:/config/EditTemplateFields/Visibility/revision",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/bag": {
            "title": "$:/config/EditTemplateFields/Visibility/bag",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
            "text": "hide"
        },
        "$:/config/EditorTypeMappings/image/gif": {
            "title": "$:/config/EditorTypeMappings/image/gif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/webp": {
            "title": "$:/config/EditorTypeMappings/image/webp",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heic": {
            "title": "$:/config/EditorTypeMappings/image/heic",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heif": {
            "title": "$:/config/EditorTypeMappings/image/heif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpeg": {
            "title": "$:/config/EditorTypeMappings/image/jpeg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpg": {
            "title": "$:/config/EditorTypeMappings/image/jpg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/png": {
            "title": "$:/config/EditorTypeMappings/image/png",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/x-icon": {
            "title": "$:/config/EditorTypeMappings/image/x-icon",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
            "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
            "text": "text"
        },
        "$:/config/Manager/Show": {
            "title": "$:/config/Manager/Show",
            "text": "tiddlers"
        },
        "$:/config/Manager/Filter": {
            "title": "$:/config/Manager/Filter",
            "text": ""
        },
        "$:/config/Manager/Order": {
            "title": "$:/config/Manager/Order",
            "text": "forward"
        },
        "$:/config/Manager/Sort": {
            "title": "$:/config/Manager/Sort",
            "text": "title"
        },
        "$:/config/Manager/System": {
            "title": "$:/config/Manager/System",
            "text": "system"
        },
        "$:/config/Manager/Tag": {
            "title": "$:/config/Manager/Tag",
            "text": ""
        },
        "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
            "title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
            "text": "hide"
        },
        "$:/config/MissingLinks": {
            "title": "$:/config/MissingLinks",
            "text": "yes"
        },
        "$:/config/Navigation/UpdateAddressBar": {
            "title": "$:/config/Navigation/UpdateAddressBar",
            "text": "no"
        },
        "$:/config/Navigation/UpdateHistory": {
            "title": "$:/config/Navigation/UpdateHistory",
            "text": "no"
        },
        "$:/config/NewImageType": {
            "title": "$:/config/NewImageType",
            "text": "jpeg"
        },
        "$:/config/OfficialPluginLibrary": {
            "title": "$:/config/OfficialPluginLibrary",
            "tags": "$:/tags/PluginLibrary",
            "url": "https://tiddlywiki.com/library/v5.1.23/index.html",
            "caption": "{{$:/language/OfficialPluginLibrary}}",
            "text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
        },
        "$:/config/Navigation/openLinkFromInsideRiver": {
            "title": "$:/config/Navigation/openLinkFromInsideRiver",
            "text": "below"
        },
        "$:/config/Navigation/openLinkFromOutsideRiver": {
            "title": "$:/config/Navigation/openLinkFromOutsideRiver",
            "text": "top"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
            "text": "hide"
        },
        "$:/config/Performance/Instrumentation": {
            "title": "$:/config/Performance/Instrumentation",
            "text": "no"
        },
        "$:/config/RegisterPluginType/plugin": {
            "title": "$:/config/RegisterPluginType/plugin",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/theme": {
            "title": "$:/config/RegisterPluginType/theme",
            "text": "no"
        },
        "$:/config/RegisterPluginType/language": {
            "title": "$:/config/RegisterPluginType/language",
            "text": "no"
        },
        "$:/config/RegisterPluginType/info": {
            "title": "$:/config/RegisterPluginType/info",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/import": {
            "title": "$:/config/RegisterPluginType/import",
            "text": "no"
        },
        "$:/config/SaveWikiButton/Template": {
            "title": "$:/config/SaveWikiButton/Template",
            "text": "$:/core/save/all"
        },
        "$:/config/SaverFilter": {
            "title": "$:/config/SaverFilter",
            "text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "true"
        },
        "$:/config/Search/MinLength": {
            "title": "$:/config/Search/MinLength",
            "text": "3"
        },
        "$:/config/SearchResults/Default": {
            "title": "$:/config/SearchResults/Default",
            "text": "$:/core/ui/DefaultSearchResultList"
        },
        "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
            "title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
            "text": "yes"
        },
        "$:/config/ShortcutInfo/add-field": {
            "title": "$:/config/ShortcutInfo/add-field",
            "text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search": {
            "title": "$:/config/ShortcutInfo/advanced-search",
            "text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search-sidebar": {
            "title": "$:/config/ShortcutInfo/advanced-search-sidebar",
            "text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/bold": {
            "title": "$:/config/ShortcutInfo/bold",
            "text": "{{$:/language/Buttons/Bold/Hint}}"
        },
        "$:/config/ShortcutInfo/cancel-edit-tiddler": {
            "title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
            "text": "{{$:/language/Buttons/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/change-sidebar-layout": {
            "title": "$:/config/ShortcutInfo/change-sidebar-layout",
            "text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}"
        },
        "$:/config/ShortcutInfo/delete-field": {
            "title": "$:/config/ShortcutInfo/delete-field",
            "text": "{{$:/language/EditTemplate/Field/Remove/Hint}}"
        },
        "$:/config/ShortcutInfo/excise": {
            "title": "$:/config/ShortcutInfo/excise",
            "text": "{{$:/language/Buttons/Excise/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-1": {
            "title": "$:/config/ShortcutInfo/heading-1",
            "text": "{{$:/language/Buttons/Heading1/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-2": {
            "title": "$:/config/ShortcutInfo/heading-2",
            "text": "{{$:/language/Buttons/Heading2/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-3": {
            "title": "$:/config/ShortcutInfo/heading-3",
            "text": "{{$:/language/Buttons/Heading3/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-4": {
            "title": "$:/config/ShortcutInfo/heading-4",
            "text": "{{$:/language/Buttons/Heading4/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-5": {
            "title": "$:/config/ShortcutInfo/heading-5",
            "text": "{{$:/language/Buttons/Heading5/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-6": {
            "title": "$:/config/ShortcutInfo/heading-6",
            "text": "{{$:/language/Buttons/Heading6/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept": {
            "title": "$:/config/ShortcutInfo/input-accept",
            "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept-variant": {
            "title": "$:/config/ShortcutInfo/input-accept-variant",
            "text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"
        },
        "$:/config/ShortcutInfo/input-cancel": {
            "title": "$:/config/ShortcutInfo/input-cancel",
            "text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/input-down": {
            "title": "$:/config/ShortcutInfo/input-down",
            "text": "{{$:/language/Shortcuts/Input/Down/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-left": {
            "title": "$:/config/ShortcutInfo/input-tab-left",
            "text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-right": {
            "title": "$:/config/ShortcutInfo/input-tab-right",
            "text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"
        },
        "$:/config/ShortcutInfo/input-up": {
            "title": "$:/config/ShortcutInfo/input-up",
            "text": "{{$:/language/Shortcuts/Input/Up/Hint}}"
        },
        "$:/config/ShortcutInfo/italic": {
            "title": "$:/config/ShortcutInfo/italic",
            "text": "{{$:/language/Buttons/Italic/Hint}}"
        },
        "$:/config/ShortcutInfo/layout-switcher": {
            "title": "$:/config/ShortcutInfo/layout-switcher",
            "text": "{{$:/language/LayoutSwitcher/Description}}"
        },
        "$:/config/ShortcutInfo/link": {
            "title": "$:/config/ShortcutInfo/link",
            "text": "{{$:/language/Buttons/Link/Hint}}"
        },
        "$:/config/ShortcutInfo/linkify": {
            "title": "$:/config/ShortcutInfo/linkify",
            "text": "{{$:/language/Buttons/Linkify/Hint}}"
        },
        "$:/config/ShortcutInfo/list-bullet": {
            "title": "$:/config/ShortcutInfo/list-bullet",
            "text": "{{$:/language/Buttons/ListBullet/Hint}}"
        },
        "$:/config/ShortcutInfo/list-number": {
            "title": "$:/config/ShortcutInfo/list-number",
            "text": "{{$:/language/Buttons/ListNumber/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-block": {
            "title": "$:/config/ShortcutInfo/mono-block",
            "text": "{{$:/language/Buttons/MonoBlock/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-line": {
            "title": "$:/config/ShortcutInfo/mono-line",
            "text": "{{$:/language/Buttons/MonoLine/Hint}}"
        },
        "$:/config/ShortcutInfo/new-image": {
            "title": "$:/config/ShortcutInfo/new-image",
            "text": "{{$:/language/Buttons/NewImage/Hint}}"
        },
        "$:/config/ShortcutInfo/new-journal": {
            "title": "$:/config/ShortcutInfo/new-journal",
            "text": "{{$:/language/Buttons/NewJournal/Hint}}"
        },
        "$:/config/ShortcutInfo/new-tiddler": {
            "title": "$:/config/ShortcutInfo/new-tiddler",
            "text": "{{$:/language/Buttons/NewTiddler/Hint}}"
        },
        "$:/config/ShortcutInfo/picture": {
            "title": "$:/config/ShortcutInfo/picture",
            "text": "{{$:/language/Buttons/Picture/Hint}}"
        },
        "$:/config/ShortcutInfo/preview": {
            "title": "$:/config/ShortcutInfo/preview",
            "text": "{{$:/language/Buttons/Preview/Hint}}"
        },
        "$:/config/ShortcutInfo/quote": {
            "title": "$:/config/ShortcutInfo/quote",
            "text": "{{$:/language/Buttons/Quote/Hint}}"
        },
        "$:/config/ShortcutInfo/save-tiddler": {
            "title": "$:/config/ShortcutInfo/save-tiddler",
            "text": "{{$:/language/Buttons/Save/Hint}}"
        },
        "$:/config/ShortcutInfo/save-wiki": {
            "title": "$:/config/ShortcutInfo/save-wiki",
            "text": "{{$:/language/Buttons/SaveWiki/Hint}}"
        },
        "$:/config/ShortcutInfo/sidebar-search": {
            "title": "$:/config/ShortcutInfo/sidebar-search",
            "text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/stamp": {
            "title": "$:/config/ShortcutInfo/stamp",
            "text": "{{$:/language/Buttons/Stamp/Hint}}"
        },
        "$:/config/ShortcutInfo/strikethrough": {
            "title": "$:/config/ShortcutInfo/strikethrough",
            "text": "{{$:/language/Buttons/Strikethrough/Hint}}"
        },
        "$:/config/ShortcutInfo/subscript": {
            "title": "$:/config/ShortcutInfo/subscript",
            "text": "{{$:/language/Buttons/Subscript/Hint}}"
        },
        "$:/config/ShortcutInfo/superscript": {
            "title": "$:/config/ShortcutInfo/superscript",
            "text": "{{$:/language/Buttons/Superscript/Hint}}"
        },
        "$:/config/ShortcutInfo/toggle-sidebar": {
            "title": "$:/config/ShortcutInfo/toggle-sidebar",
            "text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
        },
        "$:/config/ShortcutInfo/transcludify": {
            "title": "$:/config/ShortcutInfo/transcludify",
            "text": "{{$:/language/Buttons/Transcludify/Hint}}"
        },
        "$:/config/ShortcutInfo/underline": {
            "title": "$:/config/ShortcutInfo/underline",
            "text": "{{$:/language/Buttons/Underline/Hint}}"
        },
        "$:/config/SwitcherTargets/layout": {
            "title": "$:/config/SwitcherTargets/layout",
            "text": "$:/snippets/LayoutSwitcher"
        },
        "$:/config/SwitcherTargets/language": {
            "title": "$:/config/SwitcherTargets/language",
            "text": "$:/snippets/languageswitcher"
        },
        "$:/config/SwitcherTargets/palette": {
            "title": "$:/config/SwitcherTargets/palette",
            "text": "$:/core/ui/ControlPanel/Palette"
        },
        "$:/config/SwitcherTargets/theme": {
            "title": "$:/config/SwitcherTargets/theme",
            "text": "$:/core/ui/ControlPanel/Theme"
        },
        "$:/config/SyncFilter": {
            "title": "$:/config/SyncFilter",
            "text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/SyncSystemTiddlersFromServer": {
            "title": "$:/config/SyncSystemTiddlersFromServer",
            "text": "no"
        },
        "$:/config/Tags/MinLength": {
            "title": "$:/config/Tags/MinLength",
            "text": "0"
        },
        "$:/config/TextEditor/EditorHeight/Height": {
            "title": "$:/config/TextEditor/EditorHeight/Height",
            "text": "400px"
        },
        "$:/config/TextEditor/EditorHeight/Mode": {
            "title": "$:/config/TextEditor/EditorHeight/Mode",
            "text": "auto"
        },
        "$:/config/TiddlerInfo/Default": {
            "title": "$:/config/TiddlerInfo/Default",
            "text": "$:/core/ui/TiddlerInfo/Fields"
        },
        "$:/config/TiddlerInfo/Mode": {
            "title": "$:/config/TiddlerInfo/Mode",
            "text": "popup"
        },
        "$:/config/Tiddlers/TitleLinks": {
            "title": "$:/config/Tiddlers/TitleLinks",
            "text": "no"
        },
        "$:/config/Toolbar/ButtonClass": {
            "title": "$:/config/Toolbar/ButtonClass",
            "text": "tc-btn-invisible"
        },
        "$:/config/Toolbar/Icons": {
            "title": "$:/config/Toolbar/Icons",
            "text": "yes"
        },
        "$:/config/Toolbar/Text": {
            "title": "$:/config/Toolbar/Text",
            "text": "no"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
            "text": "show"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
            "text": "hide"
        },
        "$:/config/shortcuts-mac/bold": {
            "title": "$:/config/shortcuts-mac/bold",
            "text": "meta-B"
        },
        "$:/config/shortcuts-mac/input-tab-left": {
            "title": "$:/config/shortcuts-mac/input-tab-left",
            "text": "ctrl-Left"
        },
        "$:/config/shortcuts-mac/input-tab-right": {
            "title": "$:/config/shortcuts-mac/input-tab-right",
            "text": "ctrl-Right"
        },
        "$:/config/shortcuts-mac/italic": {
            "title": "$:/config/shortcuts-mac/italic",
            "text": "meta-I"
        },
        "$:/config/shortcuts-mac/underline": {
            "title": "$:/config/shortcuts-mac/underline",
            "text": "meta-U"
        },
        "$:/config/shortcuts-mac/new-image": {
            "title": "$:/config/shortcuts-mac/new-image",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-mac/new-journal": {
            "title": "$:/config/shortcuts-mac/new-journal",
            "text": "ctrl-J"
        },
        "$:/config/shortcuts-mac/new-tiddler": {
            "title": "$:/config/shortcuts-mac/new-tiddler",
            "text": "ctrl-N"
        },
        "$:/config/shortcuts-mac/save-wiki": {
            "title": "$:/config/shortcuts-mac/save-wiki",
            "text": "meta-S"
        },
        "$:/config/shortcuts-not-mac/bold": {
            "title": "$:/config/shortcuts-not-mac/bold",
            "text": "ctrl-B"
        },
        "$:/config/shortcuts-not-mac/italic": {
            "title": "$:/config/shortcuts-not-mac/italic",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-not-mac/underline": {
            "title": "$:/config/shortcuts-not-mac/underline",
            "text": "ctrl-U"
        },
        "$:/config/shortcuts-not-mac/new-image": {
            "title": "$:/config/shortcuts-not-mac/new-image",
            "text": "alt-I"
        },
        "$:/config/shortcuts-not-mac/new-journal": {
            "title": "$:/config/shortcuts-not-mac/new-journal",
            "text": "alt-J"
        },
        "$:/config/shortcuts-not-mac/new-tiddler": {
            "title": "$:/config/shortcuts-not-mac/new-tiddler",
            "text": "alt-N"
        },
        "$:/config/shortcuts/add-field": {
            "title": "$:/config/shortcuts/add-field",
            "text": "enter"
        },
        "$:/config/shortcuts/advanced-search": {
            "title": "$:/config/shortcuts/advanced-search",
            "text": "ctrl-shift-A"
        },
        "$:/config/shortcuts/advanced-search-sidebar": {
            "title": "$:/config/shortcuts/advanced-search-sidebar",
            "text": "alt-Enter"
        },
        "$:/config/shortcuts/cancel-edit-tiddler": {
            "title": "$:/config/shortcuts/cancel-edit-tiddler",
            "text": "escape"
        },
        "$:/config/shortcuts/change-sidebar-layout": {
            "title": "$:/config/shortcuts/change-sidebar-layout",
            "text": "shift-alt-Down"
        },
        "$:/config/shortcuts/delete-field": {
            "title": "$:/config/shortcuts/delete-field",
            "text": "shift-alt-D"
        },
        "$:/config/shortcuts/excise": {
            "title": "$:/config/shortcuts/excise",
            "text": "ctrl-E"
        },
        "$:/config/shortcuts/sidebar-search": {
            "title": "$:/config/shortcuts/sidebar-search",
            "text": "ctrl-shift-F"
        },
        "$:/config/shortcuts/heading-1": {
            "title": "$:/config/shortcuts/heading-1",
            "text": "ctrl-1"
        },
        "$:/config/shortcuts/heading-2": {
            "title": "$:/config/shortcuts/heading-2",
            "text": "ctrl-2"
        },
        "$:/config/shortcuts/heading-3": {
            "title": "$:/config/shortcuts/heading-3",
            "text": "ctrl-3"
        },
        "$:/config/shortcuts/heading-4": {
            "title": "$:/config/shortcuts/heading-4",
            "text": "ctrl-4"
        },
        "$:/config/shortcuts/heading-5": {
            "title": "$:/config/shortcuts/heading-5",
            "text": "ctrl-5"
        },
        "$:/config/shortcuts/heading-6": {
            "title": "$:/config/shortcuts/heading-6",
            "text": "ctrl-6"
        },
        "$:/config/shortcuts/input-accept": {
            "title": "$:/config/shortcuts/input-accept",
            "text": "Enter"
        },
        "$:/config/shortcuts/input-accept-variant": {
            "title": "$:/config/shortcuts/input-accept-variant",
            "text": "ctrl-Enter"
        },
        "$:/config/shortcuts/input-cancel": {
            "title": "$:/config/shortcuts/input-cancel",
            "text": "Escape"
        },
        "$:/config/shortcuts/input-down": {
            "title": "$:/config/shortcuts/input-down",
            "text": "Down"
        },
        "$:/config/shortcuts/input-tab-left": {
            "title": "$:/config/shortcuts/input-tab-left",
            "text": "alt-Left"
        },
        "$:/config/shortcuts/input-tab-right": {
            "title": "$:/config/shortcuts/input-tab-right",
            "text": "alt-Right"
        },
        "$:/config/shortcuts/input-up": {
            "title": "$:/config/shortcuts/input-up",
            "text": "Up"
        },
        "$:/config/shortcuts/layout-switcher": {
            "title": "$:/config/shortcuts/layout-switcher",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/link": {
            "title": "$:/config/shortcuts/link",
            "text": "ctrl-L"
        },
        "$:/config/shortcuts/linkify": {
            "title": "$:/config/shortcuts/linkify",
            "text": "alt-shift-L"
        },
        "$:/config/shortcuts/list-bullet": {
            "title": "$:/config/shortcuts/list-bullet",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/list-number": {
            "title": "$:/config/shortcuts/list-number",
            "text": "ctrl-shift-N"
        },
        "$:/config/shortcuts/mono-block": {
            "title": "$:/config/shortcuts/mono-block",
            "text": "ctrl-shift-M"
        },
        "$:/config/shortcuts/mono-line": {
            "title": "$:/config/shortcuts/mono-line",
            "text": "ctrl-M"
        },
        "$:/config/shortcuts/picture": {
            "title": "$:/config/shortcuts/picture",
            "text": "ctrl-shift-I"
        },
        "$:/config/shortcuts/preview": {
            "title": "$:/config/shortcuts/preview",
            "text": "alt-P"
        },
        "$:/config/shortcuts/quote": {
            "title": "$:/config/shortcuts/quote",
            "text": "ctrl-Q"
        },
        "$:/config/shortcuts/save-tiddler": {
            "title": "$:/config/shortcuts/save-tiddler",
            "text": "ctrl+enter"
        },
        "$:/config/shortcuts/save-wiki": {
            "title": "$:/config/shortcuts/save-wiki",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/stamp": {
            "title": "$:/config/shortcuts/stamp",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/strikethrough": {
            "title": "$:/config/shortcuts/strikethrough",
            "text": "ctrl-T"
        },
        "$:/config/shortcuts/subscript": {
            "title": "$:/config/shortcuts/subscript",
            "text": "ctrl-shift-B"
        },
        "$:/config/shortcuts/superscript": {
            "title": "$:/config/shortcuts/superscript",
            "text": "ctrl-shift-P"
        },
        "$:/config/shortcuts/toggle-sidebar": {
            "title": "$:/config/shortcuts/toggle-sidebar",
            "text": "alt-shift-S"
        },
        "$:/config/shortcuts/transcludify": {
            "title": "$:/config/shortcuts/transcludify",
            "text": "alt-shift-T"
        },
        "$:/config/ui/EditTemplate": {
            "title": "$:/config/ui/EditTemplate",
            "text": "$:/core/ui/EditTemplate"
        },
        "$:/config/ui/ViewTemplate": {
            "title": "$:/config/ui/ViewTemplate",
            "text": "$:/core/ui/ViewTemplate"
        },
        "$:/config/WikiParserRules/Inline/wikilink": {
            "title": "$:/config/WikiParserRules/Inline/wikilink",
            "text": "enable"
        },
        "$:/snippets/currpalettepreview": {
            "title": "$:/snippets/currpalettepreview",
            "text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n"
        },
        "$:/snippets/download-wiki-button": {
            "title": "$:/snippets/download-wiki-button",
            "text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
        },
        "$:/language": {
            "title": "$:/language",
            "text": "$:/languages/en-GB"
        },
        "$:/snippets/languageswitcher": {
            "title": "$:/snippets/languageswitcher",
            "text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/macros/CSS": {
            "title": "$:/core/macros/CSS",
            "tags": "$:/tags/Macro",
            "text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n  -webkit-box-shadow: $shadow$;\n     -moz-box-shadow: $shadow$;\n          box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n  -webkit-filter: $filter$;\n     -moz-filter: $filter$;\n          filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n  -webkit-transition: $transition$;\n     -moz-transition: $transition$;\n          transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n  -webkit-transform-origin: $origin$;\n     -moz-transform-origin: $origin$;\n          transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
        },
        "$:/core/macros/colour-picker": {
            "title": "$:/core/macros/colour-picker",
            "tags": "$:/tags/Macro",
            "text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
        },
        "$:/core/macros/copy-to-clipboard": {
            "title": "$:/core/macros/copy-to-clipboard",
            "tags": "$:/tags/Macro",
            "text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
        },
        "$:/core/macros/diff": {
            "title": "$:/core/macros/diff",
            "tags": "$:/tags/Macro",
            "text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
        },
        "$:/core/macros/dumpvariables": {
            "title": "$:/core/macros/dumpvariables",
            "tags": "$:/tags/Macro",
            "text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
        },
        "$:/core/macros/export": {
            "title": "$:/core/macros/export",
            "tags": "$:/tags/Macro",
            "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n"
        },
        "$:/core/macros/image-picker": {
            "title": "$:/core/macros/image-picker",
            "created": "20170715180840889",
            "modified": "20170715180914005",
            "tags": "$:/tags/Macro",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
        },
        "$:/core/macros/keyboard-driven-input": {
            "title": "$:/core/macros/keyboard-driven-input",
            "tags": "$:/tags/Macro",
            "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n"
        },
        "$:/core/macros/lingo": {
            "title": "$:/core/macros/lingo",
            "tags": "$:/tags/Macro",
            "text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
        },
        "$:/core/macros/list": {
            "title": "$:/core/macros/list",
            "tags": "$:/tags/Macro",
            "text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
        },
        "$:/core/macros/tabs": {
            "title": "$:/core/macros/tabs",
            "tags": "$:/tags/Macro",
            "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n</$vars>\n</$set>\n\\end\n"
        },
        "$:/core/macros/tag-picker": {
            "title": "$:/core/macros/tag-picker",
            "tags": "$:/tags/Macro",
            "first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]",
            "second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]",
            "text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\n</span><$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n"
        },
        "$:/core/macros/tag": {
            "title": "$:/core/macros/tag",
            "tags": "$:/tags/Macro",
            "text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
        },
        "$:/core/macros/thumbnails": {
            "title": "$:/core/macros/thumbnails",
            "tags": "$:/tags/Macro",
            "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
        },
        "$:/core/macros/timeline": {
            "title": "$:/core/macros/timeline",
            "created": "20141212105914482",
            "modified": "20141212110330815",
            "tags": "$:/tags/Macro",
            "text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n     of the same name if you need to change \n     how titles are displayed on the timeline \n     -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
        },
        "$:/core/macros/toc": {
            "title": "$:/core/macros/toc",
            "tags": "$:/tags/Macro",
            "text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n  <$transclude field=\"caption\">\n    <$view field=\"title\"/>\n  </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n  <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n    <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n      <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n        <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n          <li class=<<toc-item-class>>>\n            <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n              <<toc-caption>>\n            </$list>\n            <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n          </li>\n        </$set>\n      </$set>\n    </$vars>\n  </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n    <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n        </$button>\n      </$reveal>\n      <<toc-caption>>\n    </$link>\n    <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n      <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n    </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n    <li class=<<toc-item-class>>>\n      <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n          <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n          <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/right-arrow}}\n            </$button>\n          </$reveal>\n          <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/down-arrow}}\n            </$button>\n          </$reveal>\n        </$list>\n        <<toc-caption>>\n      </$link>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n        <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/right-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n        <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/down-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n      </$list>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-selective-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n  <div class=\"tc-tabbed-table-of-contents\">\n    <$linkcatcher to=<<__selectedTiddler__>>>\n      <div class=\"tc-table-of-contents\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n      </div>\n    </$linkcatcher>\n    <div class=\"tc-tabbed-table-of-contents-content\">\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n        <$transclude mode=\"block\" tiddler=<<__template__>>>\n          <h1><<toc-caption>></h1>\n          <$transclude mode=\"block\">$missingText$</$transclude>\n        </$transclude>\n      </$reveal>\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n        $unselectedText$\n      </$reveal>\n    </div>\n  </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n  <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
        },
        "$:/core/macros/translink": {
            "title": "$:/core/macros/translink",
            "tags": "$:/tags/Macro",
            "text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/tree": {
            "title": "$:/core/macros/tree",
            "tags": "$:/tags/Macro",
            "text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/utils": {
            "title": "$:/core/macros/utils",
            "text": "\\define colour(colour)\n$colour$\n\\end\n"
        },
        "$:/snippets/minifocusswitcher": {
            "title": "$:/snippets/minifocusswitcher",
            "text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
        },
        "$:/snippets/minilanguageswitcher": {
            "title": "$:/snippets/minilanguageswitcher",
            "text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/minithemeswitcher": {
            "title": "$:/snippets/minithemeswitcher",
            "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/modules": {
            "title": "$:/snippets/modules",
            "text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
        },
        "$:/palette": {
            "title": "$:/palette",
            "text": "$:/palettes/Vanilla"
        },
        "$:/snippets/paletteeditor": {
            "title": "$:/snippets/paletteeditor",
            "text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
        },
        "$:/snippets/palettepreview": {
            "title": "$:/snippets/palettepreview",
            "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
        },
        "$:/snippets/paletteswitcher": {
            "title": "$:/snippets/paletteswitcher",
            "text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/snippets/peek-stylesheets": {
            "title": "$:/snippets/peek-stylesheets",
            "text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
        },
        "$:/temp/search": {
            "title": "$:/temp/search",
            "text": ""
        },
        "$:/tags/AdvancedSearch": {
            "title": "$:/tags/AdvancedSearch",
            "list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
        },
        "$:/tags/AdvancedSearch/FilterButton": {
            "title": "$:/tags/AdvancedSearch/FilterButton",
            "list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
        },
        "$:/tags/ControlPanel": {
            "title": "$:/tags/ControlPanel",
            "list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
        },
        "$:/tags/ControlPanel/Info": {
            "title": "$:/tags/ControlPanel/Info",
            "list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
        },
        "$:/tags/ControlPanel/Plugins": {
            "title": "$:/tags/ControlPanel/Plugins",
            "list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
        },
        "$:/tags/EditTemplate": {
            "title": "$:/tags/EditTemplate",
            "list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
        },
        "$:/tags/EditToolbar": {
            "title": "$:/tags/EditToolbar",
            "list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
        },
        "$:/tags/EditorToolbar": {
            "title": "$:/tags/EditorToolbar",
            "list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
        },
        "$:/tags/Manager/ItemMain": {
            "title": "$:/tags/Manager/ItemMain",
            "list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
        },
        "$:/tags/Manager/ItemSidebar": {
            "title": "$:/tags/Manager/ItemSidebar",
            "list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
        },
        "$:/tags/MoreSideBar": {
            "title": "$:/tags/MoreSideBar",
            "list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
            "text": ""
        },
        "$:/tags/PageControls": {
            "title": "$:/tags/PageControls",
            "list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
        },
        "$:/tags/PageTemplate": {
            "title": "$:/tags/PageTemplate",
            "list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
            "text": ""
        },
        "$:/tags/PluginLibrary": {
            "title": "$:/tags/PluginLibrary",
            "list": "$:/config/OfficialPluginLibrary"
        },
        "$:/tags/SideBar": {
            "title": "$:/tags/SideBar",
            "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
            "text": ""
        },
        "$:/tags/SideBarSegment": {
            "title": "$:/tags/SideBarSegment",
            "list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
        },
        "$:/tags/TiddlerInfo": {
            "title": "$:/tags/TiddlerInfo",
            "list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
            "text": ""
        },
        "$:/tags/TiddlerInfo/Advanced": {
            "title": "$:/tags/TiddlerInfo/Advanced",
            "list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
        },
        "$:/tags/ViewTemplate": {
            "title": "$:/tags/ViewTemplate",
            "list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
        },
        "$:/tags/ViewToolbar": {
            "title": "$:/tags/ViewToolbar",
            "list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
        },
        "$:/snippets/themeswitcher": {
            "title": "$:/snippets/themeswitcher",
            "text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/wiki/title": {
            "title": "$:/core/wiki/title",
            "text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
        },
        "$:/view": {
            "title": "$:/view",
            "text": "classic"
        },
        "$:/snippets/viewswitcher": {
            "title": "$:/snippets/viewswitcher",
            "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        }
    }
}
\define config-title()
$(config-base)$$(currentTiddler)$
\end

<$draggable tiddler=<<currentTiddler>>>
<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <span class="tc-icon-wrapper"> <$transclude field="caption"/> <i class="tc-muted">-- <$transclude field="description"/></i></span>
</$draggable>
MainPage
master
index.html
/wiki/
intrinsical/intrinsical.github.io

The following tiddlers were imported:

# [[Rogue]]
no
{
    "tiddlers": {
        "$:/plugins/benwebber/dnd/Changelog": {
            "title": "$:/plugins/benwebber/dnd/Changelog",
            "text": "\\define unreleased() [[Unreleased|https://github.com/benwebber/tiddlywiki-dnd/compare/v$(latest)$..HEAD]]\n\\define issue(number) [[#$number$|https://github.com/benwebber/tiddlywiki-dnd/issues/$number$]]\n\\define release(version) [[$version$|https://github.com/benwebber/tiddlywiki-dnd/releases/tag/v$version$]]\n\n<$vars latest={{$:/plugins/benwebber/dnd!!version}}>\n\n! <<unreleased>>\n</$vars>\n\n! <<release 1.1.0>> (2019-02-15)\n\n!! Added\n\n* Added `dnd.attack` macro to typeset creature melee and ranged attacks.\n* Added `dnd.modifier` macro to calculate ability score modifiers independently.\n\n!! Changed\n\n* Make creature and spell tags configurable (<<issue 3>>).\n* Refactored localization code to work with core language switcher. Nearly all user-facing strings use this framework now (<<issue 2>>).\n\n!! Deprecated\n\n* Deprecated `dnd.dspell` and `dnd.fspell` in favour of a single template that determines the input tiddler's type. These templates will be removed in 2.0.0.\n* Deprecated `dnd.dstatblock` and `dnd.fstatblock` in favour of a single template that determines the input tiddler's type. These templates will be removed in 2.0.0.\n\n!! Fixed\n\n* `dnd.check` macro supports skills with spaces in the name (Animal Handling and Sleight of Hand).\n* Macros which expect boolean values now only consider the string \"true\" true (<<issue 5>>).\n\n! <<release 1.0.0>> (2018-08-31)\n\n!! Added\n\n* Added English (UK) and English (US) translations.\n* Added D&D icon from Font Awesome to plugin info block.\n* Set up Jest test harness, Travis CI, and Codecov.\n* Added creature view template.\n* Added spell macros, templates, and view templates.\n* Added toolbar buttons to create new creatures and spells.\n* Added modal update form for creatures and spells.\n\n!! Changed\n\n* Moved macro functionality to testable library.\n* Ported to ~TypeScript.\n* Store creature attributes as tiddler field values by default.\n\n!! Fixed\n\n* Use proper minus sign for ability/roll modifiers.\n* `dnd.average`: Pass through unrecognized roll expressions (support arbitrary values).\n\n! <<release 0.1.0>> (2018-07-31)\n\nInitial release.\n"
        },
        "$:/plugins/benwebber/dnd/License": {
            "title": "$:/plugins/benwebber/dnd/License",
            "text": "!! MIT License\n\nCopyright (c) 2018 Ben Webber\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/benwebber/dnd/README": {
            "title": "$:/plugins/benwebber/dnd/README",
            "text": "Manage //Dungeons & Dragons// campaigns with [[TiddlyWiki|https://tiddlywiki.com]].\n\n! Install\n\n[[Manually install|https://tiddlywiki.com/#Manually%20installing%20a%20plugin]] the plugin by dragging this link to your ~TiddlyWiki:\n\n<$list\n  filter=\"[<transclusion>prefix[{$:/plugins/benwebber/dnd/README|$:/plugins/benwebber/dnd/README|||}]]\"\n  emptyMessage=\"[[$:/plugins/benwebber/dnd]]\"\n>\n{{$:/plugins/benwebber/dnd||$:/core/ui/Components/plugin-info}}\n</$list>\n\nThen save and refresh your ~TiddlyWiki.\n\n! Quick Start\n\n!! Create a new creature\n\n<!-- Set variables to render button as it appears in the toolbar. -->\n<$vars tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"\">\nEnable the {{$:/plugins/benwebber/dnd/ui/Buttons/new-creature}} tool to create new creature tiddlers with a single click.\n</$vars>\n\nSee [[Goblin]] as an example.\n\n!! Create a new spell\n\n<!-- Set variables to render button as it appears in the toolbar. -->\n<$vars tv-config-toolbar-text=\"yes\" tv-config-toolbar-class=\"\">\nEnable the {{$:/plugins/benwebber/dnd/ui/Buttons/new-spell}} tool to create new spell tiddlers with a single click.\n</$vars>\n\nSee [[Alarm]] as an example.\n\n! Configuration\n\nNavigate to the plugin info tiddler ([[$:/plugins/benwebber/dnd]]), then go to the ''Settings'' tab.\n\n! Macros\n\n!! `dnd.ability`\n\nRenders an [[ability score|https://roll20.net/compendium/dnd5e/Ability%20Scores]] with its calculated modifier.\n\n|! Call|! Output|\n|`<<dnd.ability 8>>`|<<dnd.ability 8>>|\n|`<<dnd.ability 10>>`|<<dnd.ability 10>>|\n|`<<dnd.ability 15>>`|<<dnd.ability 15>>|\n|`<<dnd.ability 20>>`|<<dnd.ability 20>>|\n\n!! `dnd.attack`\n\nRenders creature attacks.\n\n!!! Attack and damage types\n\nAttack types and damage types are localized strings.\n\nTo specify an attack's type, use the following values:\n\n|! Value|! Attack Type|\n|`melee`|<<dnd._lingo StatBlock/Action/Melee>>|\n|`ranged`|<<dnd._lingo StatBlock/Action/Ranged>>|\n|`both`|<<dnd._lingo StatBlock/Action/MeleeOrRanged>>|\n\nSimilarly, to specify an attack's damage type, use its English name.\n\n|! Value|! Damage Type|\n|`acid`|<<dnd._lingo Damage/Type/Acid>>|\n|`bludgeoning`|<<dnd._lingo Damage/Type/Bludgeoning>>|\n|`cold`|<<dnd._lingo Damage/Type/Cold>>|\n|`fire`|<<dnd._lingo Damage/Type/Fire>>|\n|`force`|<<dnd._lingo Damage/Type/Force>>|\n|`lightning`|<<dnd._lingo Damage/Type/Lightning>>|\n|`necrotic`|<<dnd._lingo Damage/Type/Necrotic>>|\n|`piercing`|<<dnd._lingo Damage/Type/Piercing>>|\n|`poison`|<<dnd._lingo Damage/Type/Poison>>|\n|`psychic`|<<dnd._lingo Damage/Type/Psychic>>|\n|`radiant`|<<dnd._lingo Damage/Type/Radiant>>|\n|`slashing`|<<dnd._lingo Damage/Type/Slashing>>|\n|`thunder`|<<dnd._lingo Damage/Type/Thunder>>|\n\n!!! Simple melee, ranged, or melee and ranged attacks\n\n```\n<<dnd.attack\n  name:\"Rapier\"\n  type:melee\n  bonus:\"+3\"\n  reach:\"5 ft.\"\n  damage:\"1d8+1\"\n  damageType:piercing\n>>\n```\n\n<<dnd.attack name:\"Rapier\" type:melee bonus:\"+3\" reach:\"5 ft.\" damage:\"1d8+1\" damageType:piercing>>\n\n```\n<<dnd.attack\n  name:\"Heavy Crossbow\"\n  type:ranged\n  bonus:\"+2\"\n  range:\"100/400 ft.\"\n  damage:\"1d10\"\n  damageType:piercing\n>>\n```\n\n<<dnd.attack name:\"Heavy Crossbow\" type:ranged bonus:\"+2\" range:\"100/400 ft.\" damage:\"1d10\" damageType:piercing>>\n\n```\n<<dnd.attack\n  name:\"Dagger\"\n  type:both\n  bonus:\"+5\"\n  reach:\"5 ft.\"\n  range:\"20/60 ft.\"\n  damage:\"1d4+3\"\n  damageType:piercing\n>>\n```\n\n<<dnd.attack name:\"Dagger\" type:both bonus:\"+5\" reach:\"5 ft.\" range:\"20/60 ft.\" damage:\"1d4+3\" damageType:piercing>>\n\n!!! Attacks with extra damage\n\n```\n<<dnd.attack\n  name:\"Greatsword\"\n  type:melee\n  bonus:\"+15\"\n  reach:\"5 ft.\"\n  damage:\"4d6+8\"\n  damageType:\"slashing\"\n  extraDamage:\"6d8\"\n  extraDamageType:radiant\n>>\n```\n\n<<dnd.attack name:\"Greatsword\" type:melee bonus:\"+15\" reach:\"5 ft.\" damage:\"4d6+8\" damageType:slashing extraDamage:\"6d8\" extraDamageType:radiant>>\n\n!!! Attacks with conditional damage\n\n```\n<<dnd.attack\n  name:\"Longsword\"\n  type:melee\n  bonus:\"+5\"\n  reach:\"5 ft.\"\n  damage:\"1d8+3\"\n  damageType:slashing\n  condDamage:\"1d10+3\"\n  condDamageType:slashing\n  when:\"if used with two hands\"\n>>\n```\n\n<<dnd.attack name:\"Longsword\" type:melee bonus:\"+5\" reach:\"5 ft.\" damage:\"1d8+3\" damageType:slashing condDamage:\"1d10+3\" condDamageType:slashing when:\"if used with two hands\">>\n\n```\n<<dnd.attack\n  name:\"Longsword\"\n  type:melee\n  bonus:\"+5\"\n  reach:\"5 ft.\"\n  damage:\"1d8+3\"\n  damageType:slashing\n  extraDamage:\"1d4\"\n  extraDamage:fire\n  condDamage:\"1d10+3\"\n  condDamageType:slashing\n  extraCondDamage:\"1d4\"\n  extraCondDamage:fire\n  when:\"if used with two hands\"\n>>\n```\n\n<<dnd.attack name:\"Longsword\" type:melee bonus:\"+5\" reach:\"5 ft.\" damage:\"1d8+3\" damageType:slashing extraDamage:\"1d4\" extraDamageType:fire condDamage:\"1d10+3\" condDamageType:slashing extraCondDamage:\"1d4\" extraCondDamageType:fire when:\"if used with two hands\">>\n\n!!! Attacks with extra effects\n\n```\n<<dnd.attack\n  name:\"Light Crossbow\"\n  type:ranged\n  bonus:\"+6\"\n  range:\"80/320 ft.\"\n  damage:\"1d8+3\"\n  damageType:piercing\n  effect:\"and the target must make a DC 15 Constitution saving throw, taking 24 (7d6) poison damage on a failed save, or half as much damage on a successful one\"\n>>\n```\n\n<<dnd.attack name:\"Light Crossbow\" type:ranged bonus:\"+6\" range:\"80/320 ft.\" damage:\"1d8+3\" damageType:piercing effect:\"and the target must make a DC 15 Constitution saving throw, taking 24 (7d6) poison damage on a failed save, or half as much damage on a successful one\">>\n\n!!! Attacks with special targets\n\n```\n<<dnd.attack\n  name:\"Dagger\"\n  type:both\n  bonus:\"+4\"\n  reach:\"5 ft.\"\n  range:\"20/60 ft.\"\n  target:\"one creature\"\n  damage:\"1d4+2\"\n  damageType:piercing\n>>\n```\n\n<<dnd.attack name:\"Dagger\" type:both bonus:\"+4\" reach:\"5 ft.\" range:\"20/60 ft.\" target:\"one creature\" damage:\"1d4+2\" damageType:piercing>>\n\n!! `dnd.average`\n\nCalculates the average result of the specified roll.\n\n|! Call|! Output|\n|`<<dnd.average d8>>`|<<dnd.average d8>>|\n|`<<dnd.average 2d8>>`|<<dnd.average 2d8>>|\n|`<<dnd.average 2d8+2>>`|<<dnd.average 2d8+2>>|\n|`<<dnd.average 2d8-2>>`|<<dnd.average 2d8-2>>|\n|`<<dnd.average \"2d8 + 2\">>`|<<dnd.average \"2d8 + 2\">>|\n|`<<dnd.average \"2d8 - 2\">>`|<<dnd.average \"2d8 - 2\">>|\n\n!! `dnd.check`\n\nTypeset an ability check, optionally including a skill and/or DC.\nThis macro is not case-sensitive.\n\nThe macro matches English abbreviations of the ability names:\n\n| Ability | Code |h\n|<<dnd._lingo Ability/STR>> |`str` |\n|<<dnd._lingo Ability/DEX>> |`dex` |\n|<<dnd._lingo Ability/CON>> |`con` |\n|<<dnd._lingo Ability/INT>> |`int` |\n|<<dnd._lingo Ability/WIS>> |`wis` |\n|<<dnd._lingo Ability/CHA>> |`cha` |\n\nIt matches English skill names by least ambiguous prefix.\nFor example, `perc`, `perf`, and `pers` for Perception, Performance, and Persuasion, respectively.\n\n| Skill | Least Ambiguous Prefix |h\n|<<dnd._lingo Skill/Acrobatics>> |`ac` |\n|<<dnd._lingo Skill/AnimalHandling>> |`an` |\n|<<dnd._lingo Skill/Arcana>> |`ar` |\n|<<dnd._lingo Skill/Athletics>> |`at` |\n|<<dnd._lingo Skill/Deception>> |`d` |\n|<<dnd._lingo Skill/History>> |`h` |\n|<<dnd._lingo Skill/Insight>> |`ins` |\n|<<dnd._lingo Skill/Intimidation>> |`int` |\n|<<dnd._lingo Skill/Investigation>> |`inv` |\n|<<dnd._lingo Skill/Medicine>> |`m` |\n|<<dnd._lingo Skill/Nature>> |`n` |\n|<<dnd._lingo Skill/Perception>> |`perc` |\n|<<dnd._lingo Skill/Performance>> |`perf` |\n|<<dnd._lingo Skill/Persuasion>> |`pers` |\n|<<dnd._lingo Skill/Religion>> |`r` |\n|<<dnd._lingo Skill/SleightOfHand>> |`sl` |\n|<<dnd._lingo Skill/Stealth>> |`st` |\n|<<dnd._lingo Skill/Survival>> |`su` |\n\nYou can also use the full skill name, such as `<<dnd.check dex acrobatics>>` or `<<dnd.check wis \"Animal Handling\">>`.\n\n| Call | Output |h\n|`<<dnd.check int>>` |<<dnd.check int>> |\n|`<<dnd.check int dc:15>>` |<<dnd.check int dc:15>> |\n|`<<dnd.check int inv>>` |<<dnd.check int inv>> |\n|`<<dnd.check int inv 18>>` |<<dnd.check int inv 18>> |\n|`<<dnd.check cha perf>>` |<<dnd.check cha perf>> |\n|`<<dnd.check cha pers>>` |<<dnd.check cha pers>> |\n|`<<dnd.check wis su>>` |<<dnd.check wis su>> |\n|`<<dnd.check wis surv>>` |<<dnd.check wis surv>> |\n|`<<dnd.check wis survival>>` |<<dnd.check wis survival>> |\n|`<<dnd.check wis animal>>` |<<dnd.check wis animal>> |\n|`<<dnd.check wis \"Animal Handling\">>` |<<dnd.check wis \"Animal Handling\">> |\n\nFinally, the macro supports unusual ability and skill combinations, such as asking a player to make a <<dnd.check str int>> check (`<<dnd.check str int>>`).\n\n!! `dnd.creature`\n\nHelper macro to create a standalone creature tiddler.\n\nThis macro uses the [[dnd.statblock|$:/plugins/benwebber/dnd/templates/dnd.statblock]] template and stores the creature's attributes as tiddler fields.\nIt also adds a convenient button to edit the stats.\n\nIt is ''not'' necessary to use this macro if you use the automatic view template.\n\n!! `dnd.modifier`\n\nCalculates the modifier for a given ability score.\n\nGenerally you will want to use `dnd.ability` instead.\n\n|! Call|! Output|\n|`<<dnd.modifier 8>>`|<<dnd.modifier 8>>|\n|`<<dnd.modifier 10>>`|<<dnd.modifier 10>>|\n|`<<dnd.modifier 15>>`|<<dnd.modifier 15>>|\n|`<<dnd.modifier 20>>`|<<dnd.modifier 20>>|\n\n!! `dnd.spell`\n\nHelper macro to create a standalone spell tiddler.\n\nThis macro uses the [[dnd.spell|$:/plugins/benwebber/dnd/templates/dnd.spell]] template and stores the spell's attributes as tiddler fields.\nIt also adds a convenient button to edit the attributes.\n\nIt is ''not'' necessary to use this macro if you use the automatic view template.\n\n!! `dnd.statblock`\n\nRender a creature stat block.\nThis is a low-level macro.\nYou may want to use the automatic view template instead (see below).\n\n!!! Notes\n\n* Ability scores default to <<dnd.ability 10>>.\n* If not set, `language` defaults to `---`.\n\n```\n<<dnd.statblock\nsize: small\ntype: humanoid\ntags: goblinoid\nalignment: \"neutral evil\"\nac: \"15 (leather armor, shield)\"\nhp: 2d6\nspeed: \"30 ft.\"\nstr: 8\ndex: 14\nwis: 8\ncha: 8\nskills: \"Stealth +6\"\nsenses: \"darkvision 60 ft., passive Perception 9\"\nlanguages: \"Common, Goblin\"\nchallenge: 1/4\n>>\n```\n\n<$reveal type=\"nomatch\" state=\"!!dnd.statblock.state\" text=\"show\">\n\n<$button set=\"!!dnd.statblock.state\" setTo=\"show\">Show</$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"!!dnd.statblock.state\" text=\"show\">\n\n<$button set=\"!!dnd.statblock.state\" setTo=\"hide\">Hide</$button>\n\n<<dnd.statblock\nsize: small\ntype: humanoid\ntags: goblinoid\nalignment: \"neutral evil\"\nac: \"15 (leather armor, shield)\"\nhp: 2d6\nspeed: \"30 ft.\"\nstr: 8\ndex: 14\nwis: 8\ncha: 8\nskills: \"Stealth +6\"\nsenses: \"darkvision 60 ft., passive Perception 9\"\nlanguages: \"Common, Goblin\"\nchallenge: 1/4\n>>\n\n</$reveal>\n\n!! `dnd.xp`\n\nRenders experience points (XP) for the given challenge rating (CR).\n\n!!! Standard challenge ratings\n\n| Call | Output |h\n|`<<dnd.xp 0>>`|<<dnd.xp 0>>|\n|`<<dnd.xp 0 10>>`|<<dnd.xp 0 10>>|\n|`<<dnd.xp 1/2>>`|<<dnd.xp 1/2>>|\n|`<<dnd.xp 5>>`|<<dnd.xp 5>>|\n\n!!! Custom challenge ratings\n\n| Call | Output |h\n|`<<dnd.xp 40>>` |<<dnd.xp 40>>|\n|`<<dnd.xp 40 255555>>` |<<dnd.xp 40 255555>>|\n|`<<dnd.xp unknown>>`|<<dnd.xp unknown>>|\n\n! View Templates\n\n~TiddlyWiki view templates automatically inject content into tiddlers that match certain criteria.\nFor example, you might use a view template to style all tiddlers with a certain tag.\n\nThis plugin ships with two view templates:\n\n|! Template |! Description |! Example |\n|`spell` |Automatically render a spell description for all tiddlers tagged <$link to={{$:/plugins/benwebber/dnd/config/Tags/Spells}}>{{$:/plugins/benwebber/dnd/config/Tags/Spells}}</$link>. |[[Alarm]] |\n|`statblock` |Automatically render a stat block for all tiddlers tagged <$link to={{$:/plugins/benwebber/dnd/config/Tags/Creatures}}>{{$:/plugins/benwebber/dnd/config/Tags/Creatures}}</$link>. |[[Goblin]] |\n\nBoth templates are enabled by default.\nTo disable them and use the equivalent macros manually, navigate to the [[plugin settings tiddler|$:/plugins/benwebber/dnd]].\n"
        },
        "$:/plugins/benwebber/dnd/Settings": {
            "title": "$:/plugins/benwebber/dnd/Settings",
            "icon": "$:/core/images/options-button",
            "text": "\\define render-boolean(key)\n<$checkbox tiddler=\"$:/plugins/benwebber/dnd/config/$key$\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\" />\n\\end\n\n\\define edit-setting(key)\n<$edit-text tiddler=\"$:/plugins/benwebber/dnd/config/$key$\" field=\"text\" tag=\"input\" />\n\\end\n\n|<<dnd._lingo Settings/Version>> |{{$:/plugins/benwebber/dnd!!version}} |\n|<<dnd._lingo Settings/CreatureTag>> |<<edit-setting \"Tags/Creatures\">> |\n|<<dnd._lingo Settings/SpellTag>> |<<edit-setting \"Tags/Spells\">> |\n|<<dnd._lingo Settings/RenderCreatures>> | <<render-boolean \"ViewTemplates/StatBlock\">> |\n|<<dnd._lingo Settings/RenderSpells>> | <<render-boolean \"ViewTemplates/Spell\">> |\n"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.dspell": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.dspell",
            "tags": "$:/plugins/benwebber/dnd/Tags/Deprecated",
            "text": "{{||$:/plugins/benwebber/dnd/templates/dnd.spell}}"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.fspell": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.fspell",
            "tags": "$:/plugins/benwebber/dnd/Tags/Deprecated",
            "text": "{{||$:/plugins/benwebber/dnd/templates/dnd.spell}}"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.dstatblock": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.dstatblock",
            "tags": "$:/plugins/benwebber/dnd/Tags/Deprecated",
            "text": "{{||$:/plugins/benwebber/dnd/templates/dnd.statblock}}"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.fstatblock": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.fstatblock",
            "tags": "$:/plugins/benwebber/dnd/Tags/Deprecated",
            "text": "{{||$:/plugins/benwebber/dnd/templates/dnd.statblock}}"
        },
        "$:/plugins/benwebber/dnd/config/Tags/Creatures": {
            "title": "$:/plugins/benwebber/dnd/config/Tags/Creatures",
            "text": "Creatures"
        },
        "$:/plugins/benwebber/dnd/config/Tags/Spells": {
            "title": "$:/plugins/benwebber/dnd/config/Tags/Spells",
            "text": "Spells"
        },
        "$:/plugins/benwebber/dnd/config/ViewTemplates/StatBlock": {
            "title": "$:/plugins/benwebber/dnd/config/ViewTemplates/StatBlock",
            "text": "true"
        },
        "$:/plugins/benwebber/dnd/config/ViewTemplates/Spell": {
            "title": "$:/plugins/benwebber/dnd/config/ViewTemplates/Spell",
            "text": "true"
        },
        "$:/plugins/benwebber/dnd/dnd.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* tslint:disable:object-literal-sort-keys */\nvar CR_TO_XP = {\n    \"0\": 0,\n    \"1/8\": 25,\n    \"1/4\": 50,\n    \"1/2\": 100,\n    \"1\": 200,\n    \"2\": 450,\n    \"3\": 700,\n    \"4\": 1100,\n    \"5\": 1800,\n    \"6\": 2300,\n    \"7\": 2900,\n    \"8\": 3900,\n    \"9\": 5000,\n    \"10\": 5900,\n    \"11\": 7200,\n    \"12\": 8400,\n    \"13\": 10000,\n    \"14\": 11500,\n    \"15\": 13000,\n    \"16\": 15000,\n    \"17\": 18000,\n    \"18\": 20000,\n    \"19\": 22000,\n    \"20\": 25000,\n    \"21\": 33000,\n    \"22\": 41000,\n    \"23\": 50000,\n    \"24\": 62000,\n    \"25\": 75000,\n    \"26\": 90000,\n    \"27\": 105000,\n    \"28\": 120000,\n    \"29\": 135000,\n    \"30\": 155000,\n};\n/* tslint:enable */\nvar SKILL_CODES_TO_CAPTIONS = {\n    ac: \"Acrobatics\",\n    an: \"AnimalHandling\",\n    ar: \"Arcana\",\n    at: \"Athletics\",\n    d: \"Deception\",\n    h: \"History\",\n    ins: \"Insight\",\n    int: \"Intimidation\",\n    inv: \"Investigation\",\n    m: \"Medicine\",\n    n: \"Nature\",\n    perc: \"Perception\",\n    perf: \"Performance\",\n    pers: \"Persuasion\",\n    r: \"Religion\",\n    sl: \"SleightOfHand\",\n    st: \"Stealth\",\n    su: \"Survival\",\n};\nvar ABILITY_REGEX = /^(STR|DEX|CON|INT|WIS|CHA).*/i;\nvar SKILL_REGEX = new RegExp(\"^(\" + Object.keys(SKILL_CODES_TO_CAPTIONS).join(\"|\") + \").*\", \"i\");\nvar AttackType;\n(function (AttackType) {\n    AttackType[AttackType[\"Melee\"] = 0] = \"Melee\";\n    AttackType[AttackType[\"Ranged\"] = 1] = \"Ranged\";\n    AttackType[AttackType[\"MeleeOrRanged\"] = 2] = \"MeleeOrRanged\";\n})(AttackType = exports.AttackType || (exports.AttackType = {}));\nvar DamageType;\n(function (DamageType) {\n    DamageType[\"Acid\"] = \"<<dnd._lingo Damage/Type/Acid>>\";\n    DamageType[\"Bludgeoning\"] = \"<<dnd._lingo Damage/Type/Bludgeoning>>\";\n    DamageType[\"Cold\"] = \"<<dnd._lingo Damage/Type/Cold>>\";\n    DamageType[\"Fire\"] = \"<<dnd._lingo Damage/Type/Fire>>\";\n    DamageType[\"Force\"] = \"<<dnd._lingo Damage/Type/Force>>\";\n    DamageType[\"Lightning\"] = \"<<dnd._lingo Damage/Type/Lightning>>\";\n    DamageType[\"Necrotic\"] = \"<<dnd._lingo Damage/Type/Necrotic>>\";\n    DamageType[\"Piercing\"] = \"<<dnd._lingo Damage/Type/Piercing>>\";\n    DamageType[\"Poison\"] = \"<<dnd._lingo Damage/Type/Poison>>\";\n    DamageType[\"Psychic\"] = \"<<dnd._lingo Damage/Type/Psychic>>\";\n    DamageType[\"Radiant\"] = \"<<dnd._lingo Damage/Type/Radiant>>\";\n    DamageType[\"Slashing\"] = \"<<dnd._lingo Damage/Type/Slashing>>\";\n    DamageType[\"Thunder\"] = \"<<dnd._lingo Damage/Type/Thunder>>\";\n})(DamageType = exports.DamageType || (exports.DamageType = {}));\nvar Spell = /** @class */ (function () {\n    function Spell(level, school, cast, ritual, range, verbal, somatic, material, duration) {\n        this.level = level;\n        this.school = school;\n        this.cast = cast;\n        this.ritual = ritual;\n        this.range = range;\n        this.verbal = verbal;\n        this.somatic = somatic;\n        this.material = material;\n        this.duration = duration;\n    }\n    Object.defineProperty(Spell.prototype, \"isCantrip\", {\n        get: function () {\n            return !isNaN(this.level) && this.level === 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Spell.prototype.render = function () {\n        var descriptionLevel = Number.isNaN(this.level) ? \"\" : this.level;\n        var output = [\n            \"//<<dnd._spellDescription level:\\\"\" + descriptionLevel + \"\\\" school:\\\"\" + this.school + \"\\\" ritual:\\\"\" + this.ritual + \"\\\">>//\",\n            \"\",\n        ];\n        var componentFragments = [];\n        if (this.verbal) {\n            componentFragments.push(\"<<dnd._lingo Spell/Verbal>>\");\n        }\n        if (this.somatic) {\n            componentFragments.push(\"<<dnd._lingo Spell/Somatic>>\");\n        }\n        if (this.material) {\n            componentFragments.push(\"<<dnd._lingo Spell/Material>> (\" + this.material + \")\");\n        }\n        var components = componentFragments.join(\", \");\n        var fields = [\n            { caption: \"Spell/CastingTime\", value: this.cast },\n            { caption: \"Spell/Range\", value: this.range },\n            { caption: \"Spell/Components\", value: components },\n            { caption: \"Spell/Duration\", value: this.duration },\n        ];\n        output = output.concat(renderFields(fields, true));\n        output.push(\"\");\n        return output.join(\"\\n\");\n    };\n    return Spell;\n}());\nexports.Spell = Spell;\nvar StatBlock = /** @class */ (function () {\n    function StatBlock(size, type, alignment, ac, hp, speed, str, dex, con, int, wis, cha, senses, languages, challenge, tags, saves, skills, dimm, dres, dvul, cimm, cres, cvul) {\n        this.size = size;\n        this.type = type;\n        this.alignment = alignment;\n        this.ac = ac;\n        this.hp = hp;\n        this.speed = speed;\n        this.str = str;\n        this.dex = dex;\n        this.con = con;\n        this.int = int;\n        this.wis = wis;\n        this.cha = cha;\n        this.senses = senses;\n        this.languages = languages;\n        this.challenge = challenge;\n        this.tags = tags;\n        this.saves = saves;\n        this.skills = skills;\n        this.dimm = dimm;\n        this.dres = dres;\n        this.dvul = dvul;\n        this.cimm = cimm;\n        this.cres = cres;\n        this.cvul = cvul;\n    }\n    Object.defineProperty(StatBlock.prototype, \"description\", {\n        get: function () {\n            // TODO: Translate stored size, type values in description.\n            var descriptionFragments = [this.size, this.type];\n            if (this.tags) {\n                descriptionFragments.push(this.renderTags(this.tags));\n            }\n            var description = descriptionFragments.join(\" \").trim();\n            if (this.alignment) {\n                description = description + \", \" + this.alignment;\n            }\n            return description;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    StatBlock.prototype.render = function () {\n        var output = [\n            \"//\" + capitalize(this.description) + \"//\",\n            \"\",\n        ];\n        var fields = [\n            { caption: \"StatBlock/AC\", value: this.ac },\n            { caption: \"StatBlock/HP\", value: average(this.hp) },\n            { caption: \"StatBlock/Speed\", value: this.speed },\n        ];\n        output = output.concat(renderFields(fields, true));\n        output.push(\"\");\n        output.push(\"---\");\n        var abilities = [\n            { caption: \"StatBlock/STR\", value: this.str },\n            { caption: \"StatBlock/DEX\", value: this.dex },\n            { caption: \"StatBlock/CON\", value: this.con },\n            { caption: \"StatBlock/INT\", value: this.int },\n            { caption: \"StatBlock/WIS\", value: this.wis },\n            { caption: \"StatBlock/CHA\", value: this.cha },\n        ];\n        output = output.concat(this.renderAbilities(abilities));\n        output.push(\"\");\n        output.push(\"---\");\n        fields = [\n            { caption: \"StatBlock/Saves\", value: this.saves },\n            { caption: \"StatBlock/Skills\", value: this.skills },\n            { caption: \"StatBlock/DamageImmunities\", value: this.dimm },\n            { caption: \"StatBlock/DamageResistances\", value: this.dres },\n            { caption: \"StatBlock/DamageVulnerabilities\", value: this.dvul },\n            { caption: \"StatBlock/ConditionImmunities\", value: this.cimm },\n            { caption: \"StatBlock/ConditionResistances\", value: this.cres },\n            { caption: \"StatBlock/ConditionVulnerabilities\", value: this.cvul },\n        ];\n        output = output.concat(renderFields(fields, false));\n        // Does the challenge field embed XP?\n        var challengeRegexp = /(\\d+)\\s+(\\d+)?/;\n        var challengeMatch = this.challenge.match(challengeRegexp);\n        var challengeMacro = \"<<dnd.xp \\\"\" + this.challenge + \"\\\">>\";\n        if (challengeMatch && challengeMatch[2]) {\n            challengeMacro = \"<<dnd.xp \\\"\" + challengeMatch[1] + \"\\\" \\\"\" + challengeMatch[2] + \"\\\">>\";\n        }\n        fields = [\n            { caption: \"StatBlock/Senses\", value: this.senses },\n            { caption: \"StatBlock/Languages\", value: this.languages },\n            { caption: \"StatBlock/Challenge\", value: challengeMacro },\n        ];\n        output = output.concat(renderFields(fields, true));\n        output.push(\"\");\n        output.push(\"---\");\n        return output.join(\"\\n\");\n    };\n    StatBlock.prototype.renderTags = function (tags) {\n        return tags ? \"(\" + tags + \")\" : \"\";\n    };\n    StatBlock.prototype.renderAbilities = function (abilities) {\n        return [\n            \"| \" + abilities.map(function (field) { return \"<<dnd._lingo \" + field.caption + \">>\"; }).join(\" | \") + \" |h\",\n            \"| \" + abilities.map(function (field) { return ability(field.value); }).join(\" | \") + \" |\",\n        ];\n    };\n    return StatBlock;\n}());\nexports.StatBlock = StatBlock;\nfunction ability(score) {\n    return score + \" (\" + modifier(score) + \")\";\n}\nexports.ability = ability;\nfunction modifier(score) {\n    var mod = Math.floor((score - 10) / 2);\n    var op = (mod >= 0) ? \"+\" : \"−\"; // minus sign (U+2212)\n    return \"\" + op + Math.abs(mod);\n}\nexports.modifier = modifier;\nfunction average(expr) {\n    var regexp = /(\\d+)?d(\\d+)\\s?(?:(-|\\+)\\s?(\\d+))?/i;\n    var match = expr.match(regexp);\n    if (!match) {\n        return expr;\n    }\n    var nDice = parseInt(match[1], 10) || 1;\n    var nSides = parseInt(match[2], 10);\n    var op = match[3];\n    var mod = parseInt(match[4], 10) || 0;\n    var avg;\n    if (!op) {\n        avg = Math.floor(nDice * (1 + nSides) / 2 + mod);\n        return avg + \" (\" + nDice + \"d\" + nSides + \")\";\n    }\n    if (op === \"+\") {\n        avg = Math.floor(nDice * (1 + nSides) / 2 + mod);\n    }\n    else {\n        op = \"−\";\n        avg = Math.floor(nDice * (1 + nSides) / 2 - mod);\n    }\n    return avg + \" (\" + nDice + \"d\" + nSides + \" \" + op + \" \" + mod + \")\";\n}\nexports.average = average;\nfunction capitalize(s) {\n    return s.charAt(0).toLocaleUpperCase() + s.slice(1);\n}\nexports.capitalize = capitalize;\n// tslint:disable-next-line:no-shadowed-variable\nfunction check(ability, skill, dc) {\n    var abilityMatch = ability.match(ABILITY_REGEX);\n    if (!abilityMatch) {\n        return \"\";\n    }\n    var abilityCode = abilityMatch[1].toLocaleUpperCase();\n    var fragments = [\"<<dnd._lingo Ability/\" + abilityCode + \">>\"];\n    if (skill) {\n        var skillMatch = skill.match(SKILL_REGEX);\n        if (skillMatch) {\n            var skillCode = skillMatch[1].toLocaleLowerCase();\n            fragments.push(\"(<<dnd._lingo Skill/\" + SKILL_CODES_TO_CAPTIONS[skillCode] + \">>)\");\n        }\n    }\n    if (dc) {\n        fragments.unshift(\"<<dnd._lingo Check/DC>> \" + dc);\n    }\n    return fragments.join(\" \");\n}\nexports.check = check;\nfunction renderFields(fields, alwaysRender) {\n    var output = [];\n    for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {\n        var field = fields_1[_i];\n        if (alwaysRender || field.value) {\n            output.push(\"|!<<dnd._lingo \" + field.caption + \">> |\" + field.value + \" |\");\n        }\n    }\n    return output;\n}\nfunction getXP(rating) {\n    rating = rating.replace(/['\"]/g, \"\");\n    return CR_TO_XP[rating];\n}\nexports.getXP = getXP;\nfunction hit(damage, damageType, extraDamage, extraDamageType, condDamage, condDamageType, extraCondDamage, extraCondDamageType, when, effect) {\n    var buffer = [\"//<<dnd._lingo StatBlock/Action/Hit>>://\"];\n    buffer.push(renderDamage(damage, damageType, extraDamage, extraDamageType));\n    var or = \"\";\n    if (condDamage && condDamageType && when) {\n        or = renderDamage(condDamage, condDamageType, extraCondDamage, extraCondDamageType) + \" \" + when;\n    }\n    var output = buffer.join(\" \");\n    if (or) {\n        output = output + \", <<dnd._lingo StatBlock/Action/Or>> \" + or;\n    }\n    if (effect) {\n        output = output + \", \" + effect;\n    }\n    return output + \".\";\n}\nexports.hit = hit;\nfunction renderDamage(damage, damageType, extraDamage, extraDamageType) {\n    var buffer = [\n        average(damage),\n        damageType,\n    ];\n    if (extraDamage && extraDamageType) {\n        buffer = buffer.concat([\n            \"<<dnd._lingo StatBlock/Action/Plus>>\",\n            average(extraDamage),\n            extraDamageType,\n        ]);\n    }\n    return buffer.join(\" \");\n}\nfunction weaponAttack(attackType, bonus, reach, range, target) {\n    var _a;\n    // tslint:disable max-line-length\n    var attackTypesToCaptions = (_a = {},\n        _a[AttackType.Melee] = {\n            attack: \"<<dnd._lingo StatBlock/Action/Melee>>\",\n            reachOrRange: \"<<dnd._lingo StatBlock/Action/Reach>> \" + reach,\n        },\n        _a[AttackType.Ranged] = {\n            attack: \"<<dnd._lingo StatBlock/Action/Ranged>>\",\n            reachOrRange: \"<<dnd._lingo StatBlock/Action/Range>> \" + range,\n        },\n        _a[AttackType.MeleeOrRanged] = {\n            attack: \"<<dnd._lingo StatBlock/Action/MeleeOrRanged>>\",\n            reachOrRange: \"<<dnd._lingo StatBlock/Action/Reach>> \" + reach + \" <<dnd._lingo StatBlock/Action/Or>> <<dnd._lingo StatBlock/Action/Range>> \" + range,\n        },\n        _a);\n    var captions = attackTypesToCaptions[attackType];\n    var output = [\n        \"//\" + captions.attack + \":// \" + bonus + \" <<dnd._lingo StatBlock/Action/ToHit>>\",\n        captions.reachOrRange,\n        target || \"<<dnd._lingo StatBlock/Action/DefaultTarget>>\",\n    ];\n    return output.join(\", \") + \".\";\n}\nexports.weaponAttack = weaponAttack;\n",
            "title": "$:/plugins/benwebber/dnd/dnd.js",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/plugins/benwebber/dnd/icon": {
            "title": "$:/plugins/benwebber/dnd/icon",
            "text": "<!--\nd-and-d-brands icon from FontAwesome\nLicensed under Creative Commons Attribution 4.0 International\nhttps://fontawesome.com/license\n-->\n<svg aria-hidden=\"true\" data-prefix=\"fab\" data-icon=\"d-and-d\" class=\"svg-inline--fa fa-d-and-d fa-w-18\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path fill=\"currentColor\" d=\"M82.5 98.9c-.6-17.2 2-33.8 12.7-48.2.3 7.4 1.2 14.5 4.2 21.6 5.9-27.5 19.7-49.3 42.3-65.5-1.9 5.9-3.5 11.8-3 17.7 8.7-7.4 18.8-17.8 44.4-22.7 14.7-2.8 29.7-2 42.1 1 38.5 9.3 61 34.3 69.7 72.3 5.3 23.1.7 45-8.3 66.4-5.2 12.4-12 24.4-20.7 35.1-2-1.9-3.9-3.8-5.8-5.6-42.8-40.8-26.8-25.2-37.4-37.4-1.1-1.2-1-2.2-.1-3.6 8.3-13.5 11.8-28.2 10-44-1.1-9.8-4.3-18.9-11.3-26.2-14.5-15.3-39.2-15-53.5.6-11.4 12.5-14.1 27.4-10.9 43.6.2 1.3.4 2.7 0 3.9-3.4 13.7-4.6 27.6-2.5 41.6.1.5.1 1.1.1 1.6 0 .3-.1.5-.2 1.1-21.8-11-36-28.3-43.2-52.2-8.3 17.8-11.1 35.5-6.6 54.1-15.6-15.2-21.3-34.3-22-55.2zm469.6 123.2c-11.6-11.6-25-20.4-40.1-26.6-12.8-5.2-26-7.9-39.9-7.1-10 .6-19.6 3.1-29 6.4-2.5.9-5.1 1.6-7.7 2.2-4.9 1.2-7.3-3.1-4.7-6.8 3.2-4.6 3.4-4.2 15-12 .6-.4 1.2-.8 2.2-1.5h-2.5c-.6 0-1.2.2-1.9.3-19.3 3.3-30.7 15.5-48.9 29.6-10.4 8.1-13.8 3.8-12-.5 1.4-3.5 3.3-6.7 5.1-10 1-1.8 2.3-3.4 3.5-5.1-.2-.2-.5-.3-.7-.5-27 18.3-46.7 42.4-57.7 73.3.3.3.7.6 1 .9.3-.6.5-1.2.9-1.7 10.4-12.1 22.8-21.8 36.6-29.8 18.2-10.6 37.5-18.3 58.7-20.2 4.3-.4 8.7-.1 13.1-.1-1.8.7-3.5.9-5.3 1.1-18.5 2.4-35.5 9-51.5 18.5-30.2 17.9-54.5 42.2-75.1 70.4-.3.4-.4.9-.7 1.3 14.5 5.3 24 17.3 36.1 25.6.2-.1.3-.2.4-.4l1.2-2.7c12.2-26.9 27-52.3 46.7-74.5 16.7-18.8 38-25.3 62.5-20 5.9 1.3 11.4 4.4 17.2 6.8 2.3-1.4 5.1-3.2 8-4.7 8.4-4.3 17.4-7 26.7-9 14.7-3.1 29.5-4.9 44.5-1.3v-.5c-.5-.4-1.2-.8-1.7-1.4zM316.7 397.6c-39.4-33-22.8-19.5-42.7-35.6-.8.9 0-.2-1.9 3-11.2 19.1-25.5 35.3-44 47.6-10.3 6.8-21.5 11.8-34.1 11.8-21.6 0-38.2-9.5-49.4-27.8-12-19.5-13.3-40.7-8.2-62.6 7.8-33.8 30.1-55.2 38.6-64.3-18.7-6.2-33 1.7-46.4 13.9.8-13.9 4.3-26.2 11.8-37.3-24.3 10.6-45.9 25-64.8 43.9-.3-5.8 5.4-43.7 5.6-44.7.3-2.7-.6-5.3-3-7.4-24.2 24.7-44.5 51.8-56.1 84.6 7.4-5.9 14.9-11.4 23.6-16.2-8.3 22.3-19.6 52.8-7.8 101.1 4.6 19 11.9 36.8 24.1 52.3 2.9 3.7 6.3 6.9 9.5 10.3.2-.2.4-.3.6-.5-1.4-7-2.2-14.1-1.5-21.9 2.2 3.2 3.9 6 5.9 8.6 12.6 16 28.7 27.4 47.2 35.6 25 11.3 51.1 13.3 77.9 8.6 54.9-9.7 90.7-48.6 116-98.8 1-1.8.6-2.9-.9-4.2zm172-46.4c-9.5-3.1-22.2-4.2-28.7-2.9 9.9 4 14.1 6.6 18.8 12 12.6 14.4 10.4 34.7-5.4 45.6-11.7 8.1-24.9 10.5-38.9 9.1-1.2-.1-2.3-.4-3-.6 2.8-3.7 6-7 8.1-10.8 9.4-16.8 5.4-42.1-8.7-56.1-2.1-2.1-4.6-3.9-7-5.9-.3 1.3-.1 2.1.1 2.8 4.2 16.6-8.1 32.4-24.8 31.8-7.6-.3-13.9-3.8-19.6-8.5-19.5-16.1-39.1-32.1-58.5-48.3-5.9-4.9-12.5-8.1-20.1-8.7-4.6-.4-9.3-.6-13.9-.9-5.9-.4-8.8-2.8-10.4-8.4-.9-3.4-1.5-6.8-2.2-10.2-1.5-8.1-6.2-13-14.3-14.2-4.4-.7-8.9-1-13.3-1.5-13-1.4-19.8-7.4-22.6-20.3-5 11-1.6 22.4 7.3 29.9 4.5 3.8 9.3 7.3 13.8 11.2 4.6 3.8 7.4 8.7 7.9 14.8.4 4.7.8 9.5 1.8 14.1 2.2 10.6 8.9 18.4 17 25.1 16.5 13.7 33 27.3 49.5 41.1 17.9 15 13.9 32.8 13 56-.9 22.9 12.2 42.9 33.5 51.2 1 .4 2 .6 3.6 1.1-15.7-18.2-10.1-44.1.7-52.3.3 2.2.4 4.3.9 6.4 9.4 44.1 45.4 64.2 85 56.9 16-2.9 30.6-8.9 42.9-19.8 2-1.8 3.7-4.1 5.9-6.5-19.3 4.6-35.8.1-50.9-10.6.7-.3 1.3-.3 1.9-.3 21.3 1.8 40.6-3.4 57-17.4 19.5-16.6 26.6-42.9 17.4-66-8.3-20.1-23.6-32.3-43.8-38.9zM99.4 179.3c-5.3-9.2-13.2-15.6-22.1-21.3 13.7-.5 26.6.2 39.6 3.7-7-12.2-8.5-24.7-5-38.7 5.3 11.9 13.7 20.1 23.6 26.8 19.7 13.2 35.7 19.6 46.7 30.2 3.4 3.3 6.3 7.1 9.6 10.9-.8-2.1-1.4-4.1-2.2-6-5-10.6-13-18.6-22.6-25-1.8-1.2-2.8-2.5-3.4-4.5-3.3-12.5-3-25.1-.7-37.6 1-5.5 2.8-10.9 4.5-16.3.8-2.4 2.3-4.6 4-6.6.6 6.9 0 25.5 19.6 46 10.8 11.3 22.4 21.9 33.9 32.7 9 8.5 18.3 16.7 25.5 26.8 1.1 1.6 2.2 3.3 3.8 4.7-5-13-14.2-24.1-24.2-33.8-9.6-9.3-19.4-18.4-29.2-27.4-3.3-3-4.6-6.7-5.1-10.9-1.2-10.4 0-20.6 4.3-30.2.5-1 1.1-2 1.9-3.3.5 4.2.6 7.9 1.4 11.6 4.8 23.1 20.4 36.3 49.3 63.5 10 9.4 19.3 19.2 25.6 31.6 4.8 9.3 7.3 19 5.7 29.6-.1.6.5 1.7 1.1 2 6.2 2.6 10 6.9 9.7 14.3 7.7-2.6 12.5-8 16.4-14.5 4.2 20.2-9.1 50.3-27.2 58.7.4-4.5 5-23.4-16.5-27.7-6.8-1.3-12.8-1.3-22.9-2.1 4.7-9 10.4-20.6.5-22.4-24.9-4.6-52.8 1.9-57.8 4.6 8.2.4 16.3 1 23.5 3.3-2 6.5-4 12.7-5.8 18.9-1.9 6.5 2.1 14.6 9.3 9.6 1.2-.9 2.3-1.9 3.3-2.7-3.1 17.9-2.9 15.9-2.8 18.3.3 10.2 9.5 7.8 15.7 7.3-2.5 11.8-29.5 27.3-45.4 25.8 7-4.7 12.7-10.3 15.9-17.9-6.5.8-12.9 1.6-19.2 2.4l-.3-.9c4.7-3.4 8-7.8 10.2-13.1 8.7-21.1-3.6-38-25-39.9-9.1-.8-17.8.8-25.9 5.5 6.2-15.6 17.2-26.6 32.6-34.5-15.2-4.3-8.9-2.7-24.6-6.3 14.6-9.3 30.2-13.2 46.5-14.6-5.2-3.2-48.1-3.6-70.2 20.9 7.9 1.4 15.5 2.8 23.2 4.2-23.8 7-44 19.7-62.4 35.6 1.1-4.8 2.7-9.5 3.3-14.3.6-4.5.8-9.2.1-13.6-1.5-9.4-8.9-15.1-19.7-16.3-7.9-.9-15.6.1-23.3 1.3-.9.1-1.7.3-2.9 0 15.8-14.8 36-21.7 53.1-33.5 6-4.5 6.8-8.2 3-14.9zm128.4 26.8c3.3 16 12.6 25.5 23.8 24.3-4.6-11.3-12.1-19.5-23.8-24.3z\"></path></svg>\n"
        },
        "$:/plugins/benwebber/dnd/images/new-creature": {
            "title": "$:/plugins/benwebber/dnd/images/new-creature",
            "text": "<!--\n  user-plus-solid icon from FontAwesome\n  Licensed under Creative Commons Attribution 4.0 International\n  https://fontawesome.com/license\n\n  Modified by setting TiddlyWiki classes, height, and width.\n-->\n<svg aria-hidden=\"true\" data-prefix=\"fas\" data-icon=\"user-plus\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\" class=\"tc-image-new-image-button tc-image-button\" width=\"22pt\" height=\"22pt\"><path fill=\"currentColor\" d=\"M624 208h-64v-64c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v64h-64c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h64v64c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-64h64c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm-400 48c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z\"></path></svg>\n"
        },
        "$:/plugins/benwebber/dnd/images/new-spell": {
            "title": "$:/plugins/benwebber/dnd/images/new-spell",
            "text": "<!--\n  magic icon from FontAwesome\n  Licensed under Creative Commons Attribution 4.0 International\n  https://fontawesome.com/license\n\n  Modified by setting TiddlyWiki classes, height, and width.\n-->\n<svg aria-hidden=\"true\" data-prefix=\"fas\" data-icon=\"magic\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" class=\"tc-image-new-image-button tc-image-button\" width=\"22pt\" height=\"22pt\"><path fill=\"currentColor\" d=\"M224 96l16-32 32-16-32-16-16-32-16 32-32 16 32 16 16 32zM80 160l26.66-53.33L160 80l-53.34-26.67L80 0 53.34 53.33 0 80l53.34 26.67L80 160zm352 128l-26.66 53.33L352 368l53.34 26.67L432 448l26.66-53.33L512 368l-53.34-26.67L432 288zm70.62-193.77L417.77 9.38C411.53 3.12 403.34 0 395.15 0c-8.19 0-16.38 3.12-22.63 9.38L9.38 372.52c-12.5 12.5-12.5 32.76 0 45.25l84.85 84.85c6.25 6.25 14.44 9.37 22.62 9.37 8.19 0 16.38-3.12 22.63-9.37l363.14-363.15c12.5-12.48 12.5-32.75 0-45.24zM359.45 203.46l-50.91-50.91 86.6-86.6 50.91 50.91-86.6 86.6z\"></path></svg>\n"
        },
        "$:/plugins/benwebber/dnd/language/Ability/STR": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/STR",
            "text": "Strength"
        },
        "$:/plugins/benwebber/dnd/language/Ability/DEX": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/DEX",
            "text": "Dexterity"
        },
        "$:/plugins/benwebber/dnd/language/Ability/CON": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/CON",
            "text": "Constitution"
        },
        "$:/plugins/benwebber/dnd/language/Ability/INT": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/INT",
            "text": "Intelligence"
        },
        "$:/plugins/benwebber/dnd/language/Ability/WIS": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/WIS",
            "text": "Wisdom"
        },
        "$:/plugins/benwebber/dnd/language/Ability/CHA": {
            "title": "$:/plugins/benwebber/dnd/language/Ability/CHA",
            "text": "Charisma"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Text": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Text",
            "text": "new creature"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Title": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Title",
            "text": "New Creature"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Tooltip": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewCreature/Tooltip",
            "text": "Create a new creature"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Text": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Text",
            "text": "new spell"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Title": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Title",
            "text": "New Spell"
        },
        "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Tooltip": {
            "title": "$:/plugins/benwebber/dnd/language/Buttons/NewSpell/Tooltip",
            "text": "Create a new spell"
        },
        "$:/plugins/benwebber/dnd/language/Check/DC": {
            "title": "$:/plugins/benwebber/dnd/language/Check/DC",
            "text": "DC"
        },
        "$:/plugins/benwebber/dnd/language/EditCurrentTiddler": {
            "title": "$:/plugins/benwebber/dnd/language/EditCurrentTiddler",
            "text": "Edit <<sourceTiddler>>"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Tiny": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Tiny",
            "text": "Tiny"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Small": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Small",
            "text": "Small"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Medium": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Medium",
            "text": "Medium"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Large": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Large",
            "text": "Large"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Huge": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Huge",
            "text": "Huge"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Size/Gargantuan": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Size/Gargantuan",
            "text": "Gargantuan"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Aberration": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Aberration",
            "text": "Aberration"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Beast": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Beast",
            "text": "Beast"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Celestial": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Celestial",
            "text": "Celestial"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Construct": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Construct",
            "text": "Construct"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Dragon": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Dragon",
            "text": "Dragon"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Elemental": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Elemental",
            "text": "Elemental"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Fey": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Fey",
            "text": "Fey"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Fiend": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Fiend",
            "text": "Fiend"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Giant": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Giant",
            "text": "Giant"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Humanoid": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Humanoid",
            "text": "Humanoid"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Monstrosity": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Monstrosity",
            "text": "Monstrosity"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Ooze": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Ooze",
            "text": "Ooze"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Plant": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Plant",
            "text": "Plant"
        },
        "$:/plugins/benwebber/dnd/language/Creature/Type/Undead": {
            "title": "$:/plugins/benwebber/dnd/language/Creature/Type/Undead",
            "text": "Undead"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Acid": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Acid",
            "text": "acid damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Bludgeoning": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Bludgeoning",
            "text": "bludgeoning damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Cold": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Cold",
            "text": "cold damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Fire": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Fire",
            "text": "fire damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Force": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Force",
            "text": "force damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Lightning": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Lightning",
            "text": "lightning damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Necrotic": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Necrotic",
            "text": "necrotic damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Piercing": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Piercing",
            "text": "piercing damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Poison": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Poison",
            "text": "poison damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Psychic": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Psychic",
            "text": "psychic damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Radiant": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Radiant",
            "text": "radiant damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Slashing": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Slashing",
            "text": "slashing damage"
        },
        "$:/plugins/benwebber/dnd/language/Damage/Type/Thunder": {
            "title": "$:/plugins/benwebber/dnd/language/Damage/Type/Thunder",
            "text": "thunder damage"
        },
        "$:/plugins/benwebber/dnd/language/Modals/Subtitle": {
            "title": "$:/plugins/benwebber/dnd/language/Modals/Subtitle",
            "text": "Editing <<tiddler>>"
        },
        "$:/plugins/benwebber/dnd/language/Modals/Help": {
            "title": "$:/plugins/benwebber/dnd/language/Modals/Help",
            "text": "//Changes take effect immediately.//"
        },
        "$:/plugins/benwebber/dnd/language/Settings/Version": {
            "title": "$:/plugins/benwebber/dnd/language/Settings/Version",
            "text": "Version"
        },
        "$:/plugins/benwebber/dnd/language/Settings/CreatureTag": {
            "title": "$:/plugins/benwebber/dnd/language/Settings/CreatureTag",
            "text": "Tag for creature tiddlers"
        },
        "$:/plugins/benwebber/dnd/language/Settings/SpellTag": {
            "title": "$:/plugins/benwebber/dnd/language/Settings/SpellTag",
            "text": "Tag for spell tiddlers"
        },
        "$:/plugins/benwebber/dnd/language/Settings/RenderCreatures": {
            "title": "$:/plugins/benwebber/dnd/language/Settings/RenderCreatures",
            "text": "Automatically render stat blocks for creature tiddlers"
        },
        "$:/plugins/benwebber/dnd/language/Settings/RenderSpells": {
            "title": "$:/plugins/benwebber/dnd/language/Settings/RenderSpells",
            "text": "Automatically render stat blocks for spell tiddlers"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Acrobatics": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Acrobatics",
            "text": "Acrobatics"
        },
        "$:/plugins/benwebber/dnd/language/Skill/AnimalHandling": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/AnimalHandling",
            "text": "Animal Handling"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Arcana": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Arcana",
            "text": "Arcana"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Athletics": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Athletics",
            "text": "Athletics"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Deception": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Deception",
            "text": "Deception"
        },
        "$:/plugins/benwebber/dnd/language/Skill/History": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/History",
            "text": "History"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Insight": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Insight",
            "text": "Insight"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Intimidation": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Intimidation",
            "text": "Intimidation"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Investigation": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Investigation",
            "text": "Investigation"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Medicine": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Medicine",
            "text": "Medicine"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Nature": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Nature",
            "text": "Nature"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Perception": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Perception",
            "text": "Perception"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Performance": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Performance",
            "text": "Performance"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Persuasion": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Persuasion",
            "text": "Persuasion"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Religion": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Religion",
            "text": "Religion"
        },
        "$:/plugins/benwebber/dnd/language/Skill/SleightOfHand": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/SleightOfHand",
            "text": "Sleight of Hand"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Stealth": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Stealth",
            "text": "Stealth"
        },
        "$:/plugins/benwebber/dnd/language/Skill/Survival": {
            "title": "$:/plugins/benwebber/dnd/language/Skill/Survival",
            "text": "Survival"
        },
        "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Default": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Default",
            "text": "$level$$levelSuffix$-level $school$"
        },
        "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Ritual": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Ritual",
            "text": "$level$$levelSuffix$-level $school$ (ritual)"
        },
        "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Cantrip": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/DescriptionFormat/Cantrip",
            "text": "$School$ cantrip"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Level": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Level",
            "text": "Level"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/1": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/1",
            "text": "st"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/2": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/2",
            "text": "nd"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/3": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/3",
            "text": "rd"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/4": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/4",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/5": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/5",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/6": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/6",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/7": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/7",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/8": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/8",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/9": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/LevelSuffix/9",
            "text": "th"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School",
            "text": "School"
        },
        "$:/plugins/benwebber/dnd/language/Spell/CastingTime": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/CastingTime",
            "text": "Casting Time"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Range": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Range",
            "text": "Range"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Duration": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Duration",
            "text": "Duration"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Components": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Components",
            "text": "Components"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Abjuration": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Abjuration",
            "text": "Abjuration"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Conjuration": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Conjuration",
            "text": "Conjuration"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Divination": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Divination",
            "text": "Divination"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Enchantment": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Enchantment",
            "text": "Enchantment"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Evocation": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Evocation",
            "text": "Evocation"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Illusion": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Illusion",
            "text": "Illusion"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Necromancy": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Necromancy",
            "text": "Necromancy"
        },
        "$:/plugins/benwebber/dnd/language/Spell/School/Transmutation": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/School/Transmutation",
            "text": "Transmutation"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Ritual": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Ritual",
            "text": "Ritual"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Verbal": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Verbal",
            "text": "V"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Somatic": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Somatic",
            "text": "S"
        },
        "$:/plugins/benwebber/dnd/language/Spell/Material": {
            "title": "$:/plugins/benwebber/dnd/language/Spell/Material",
            "text": "M"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Size": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Size",
            "text": "Size"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Type": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Type",
            "text": "Type"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Tags": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Tags",
            "text": "Tags"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Alignment": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Alignment",
            "text": "Alignment"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/AC": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/AC",
            "text": "Armour Class"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/HP": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/HP",
            "text": "Hit Points"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Speed": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Speed",
            "text": "Speed"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/STR": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/STR",
            "text": "STR"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/DEX": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/DEX",
            "text": "DEX"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/CON": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/CON",
            "text": "CON"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/INT": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/INT",
            "text": "INT"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/WIS": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/WIS",
            "text": "WIS"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/CHA": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/CHA",
            "text": "CHA"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/SavingThrows": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/SavingThrows",
            "text": "Saving Throws"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Senses": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Senses",
            "text": "Senses"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Languages": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Languages",
            "text": "Languages"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Challenge": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Challenge",
            "text": "Challenge"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Saves": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Saves",
            "text": "Saving Throws"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Skills": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Skills",
            "text": "Skills"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/DamageImmunities": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/DamageImmunities",
            "text": "Damage Immunities"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/DamageResistances": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/DamageResistances",
            "text": "Damage Resistances"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/DamageVulnerabilities": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/DamageVulnerabilities",
            "text": "Damage Vulnerabilities"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/ConditionImmunities": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/ConditionImmunities",
            "text": "Condition Immunities"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/ConditionResistances": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/ConditionResistances",
            "text": "Condition Resistances"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/ConditionVulnerabilities": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/ConditionVulnerabilities",
            "text": "Condition Vulnerabilities"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Damage": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Damage",
            "text": "damage"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/DefaultTarget": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/DefaultTarget",
            "text": "one target"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Hit": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Hit",
            "text": "Hit"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Melee": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Melee",
            "text": "Melee Weapon Attack"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/MeleeOrRanged": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/MeleeOrRanged",
            "text": "Melee or Ranged Weapon Attack"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Or": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Or",
            "text": "or"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Plus": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Plus",
            "text": "plus"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Range": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Range",
            "text": "range"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Ranged": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Ranged",
            "text": "Ranged Weapon Attack"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/Reach": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/Reach",
            "text": "reach"
        },
        "$:/plugins/benwebber/dnd/language/StatBlock/Action/ToHit": {
            "title": "$:/plugins/benwebber/dnd/language/StatBlock/Action/ToHit",
            "text": "to hit"
        },
        "$:/plugins/benwebber/dnd/language/XP": {
            "title": "$:/plugins/benwebber/dnd/language/XP",
            "text": "XP"
        },
        "$:/plugins/benwebber/dnd/languages/en-US/StatBlock/AC": {
            "title": "$:/plugins/benwebber/dnd/languages/en-US/StatBlock/AC",
            "text": "Armor Class"
        },
        "$:/plugins/benwebber/dnd/macros/creature": {
            "title": "$:/plugins/benwebber/dnd/macros/creature",
            "tags": "$:/tags/Macro",
            "text": "\\define creature-actions()\n<!--\nIf the user enters, then deletes a value in the form, the corresponding field\nwill be empty. Delete empty fields.\n-->\n<$list filter=\"[title<currentTiddler>fields[]]\" variable=\"field\">\n<$list filter=\"[title<currentTiddler>!has<field>]\">\n<$action-deletefield $field=<<field>> />\n</$list>\n</$list>\n<!-- Open editor form. -->\n<$action-sendmessage\n  $message=\"tm-modal\"\n  $param=\"$:/plugins/benwebber/dnd/ui/Modals/UpdateCreature\"\n  tiddler=<<currentTiddler>>\n/>\n\\end\n\n\\define dnd.creature()\n{{||$:/plugins/benwebber/dnd/templates/dnd.statblock}}\n\n<$set name=\"sourceTiddler\" value=<<currentTiddler>>>\n<$button actions=<<creature-actions>>><<dnd._lingo EditCurrentTiddler>></$button>\n</$set>\n\\end\n"
        },
        "$:/plugins/benwebber/dnd/macros/spell": {
            "title": "$:/plugins/benwebber/dnd/macros/spell",
            "tags": "$:/tags/Macro",
            "text": "\\define spell-actions()\n<!--\nIf the user enters, then deletes a value in the form, the corresponding field\nwill be empty. Delete empty fields.\n-->\n<$list filter=\"[title<currentTiddler>fields[]]\" variable=\"field\">\n<$list filter=\"[title<currentTiddler>!has<field>]\">\n<$action-deletefield $field=<<field>> />\n</$list>\n</$list>\n<!-- Open editor form. -->\n<$action-sendmessage\n  $message=\"tm-modal\"\n  $param=\"$:/plugins/benwebber/dnd/ui/Modals/UpdateSpell\"\n  tiddler=<<currentTiddler>>\n/>\n\\end\n\n\\define dnd.spell()\n{{||$:/plugins/benwebber/dnd/templates/dnd.spell}}\n\n<$set name=\"sourceTiddler\" value=<<currentTiddler>>>\n<$button actions=<<spell-actions>>><<dnd._lingo EditCurrentTiddler>></$button>\n</$set>\n\\end\n"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd._lingo.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.name = \"dnd._lingo\";\nexports.params = [\n    { name: \"title\" },\n];\nfunction run(title) {\n    var plugin = \"benwebber/dnd\";\n    var languageTitle = this.getVariable(\"languageTitle\");\n    var tiddlerTitle = \"$:/plugins/\" + plugin + \"/languages/\" + languageTitle + \"/\" + title;\n    if (this.wiki.isShadowTiddler(tiddlerTitle)) {\n        return \"{{\" + tiddlerTitle + \"}}\";\n    }\n    // Check if string is defined in dependency.\n    var dependents = this.wiki.getTextReference(\"$:/languages/\" + languageTitle + \"!!dependents\", \"\");\n    var dependentLanguageTitles = $tw.utils.parseStringArray(dependents)\n        .map(function (tiddler) { return tiddler.replace(\"$:/languages/\", \"\"); });\n    for (var _i = 0, dependentLanguageTitles_1 = dependentLanguageTitles; _i < dependentLanguageTitles_1.length; _i++) {\n        var dependentLanguageTitle = dependentLanguageTitles_1[_i];\n        var dependentTiddlerTitle = \"$:/plugins/\" + plugin + \"/languages/\" + dependentLanguageTitle + \"/\" + title;\n        if (this.wiki.isShadowTiddler(dependentTiddlerTitle)) {\n            return \"{{\" + dependentTiddlerTitle + \"}}\";\n        }\n    }\n    // Fall back to default string.\n    return \"{{$:/plugins/\" + plugin + \"/language/\" + title + \"}}\";\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd._lingo.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd._spellDescription.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd._spellDescription\";\nexports.params = [\n    { name: \"level\" },\n    { name: \"school\" },\n    { name: \"ritual\" },\n];\nfunction run(level, school, ritual) {\n    var isRitual = ritual === \"true\";\n    // tslint:disable no-shadowed-variable\n    var isCantrip = function (level) { return parseInt(level, 10) === 0; };\n    var template;\n    if (isCantrip(level)) {\n        template = \"Spell/DescriptionFormat/Cantrip\";\n    }\n    else if (isRitual) {\n        template = \"Spell/DescriptionFormat/Ritual\";\n    }\n    else {\n        template = \"Spell/DescriptionFormat/Default\";\n    }\n    var format = this.wiki.renderText(\"text/plain\", \"text/vnd.tiddlywiki\", \"<<dnd._lingo \" + template + \">>\");\n    var schoolName = this.wiki.renderText(\"text/plain\", \"text/vnd.tiddlywiki\", \"<<dnd._lingo Spell/School/\" + dnd_js_1.capitalize(school) + \">>\");\n    var replacements = {\n        School: schoolName,\n        level: level,\n        levelSuffix: \"<<dnd._lingo Spell/LevelSuffix/\" + level + \">>\",\n        school: schoolName.toLocaleLowerCase(),\n    };\n    var rendered = format.replace(/\\$(\\w+)\\$/g, function (_, key) { return replacements[key]; });\n    return rendered;\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd._spellDescription.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.ability.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.ability\";\nexports.params = [{ name: \"score\" }];\nfunction run(score) {\n    var nScore = Number.parseInt(score, 10);\n    return dnd_js_1.ability(nScore);\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.ability.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.attack.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.attack\";\nexports.params = [\n    { name: \"name\" },\n    { name: \"type\" },\n    { name: \"bonus\" },\n    { name: \"reach\" },\n    { name: \"range\" },\n    { name: \"target\" },\n    { name: \"damage\" },\n    { name: \"damageType\" },\n    { name: \"extraDamage\" },\n    { name: \"extraDamageType\" },\n    { name: \"condDamage\" },\n    { name: \"condDamageType\" },\n    { name: \"extraCondDamage\" },\n    { name: \"extraCondDamageType\" },\n    { name: \"when\" },\n    { name: \"effect\" },\n];\n// tslint:disable no-shadowed-variable\nfunction run(name, attackType, bonus, reach, range, target, damage, damageType, extraDamage, extraDamageType, condDamage, condDamageType, extraCondDamage, extraCondDamageType, when, effect) {\n    var attackTypes = {\n        both: dnd_js_1.AttackType.MeleeOrRanged,\n        melee: dnd_js_1.AttackType.Melee,\n        ranged: dnd_js_1.AttackType.Ranged,\n    };\n    var damageTypes = {\n        acid: dnd_js_1.DamageType.Acid,\n        bludgeoning: dnd_js_1.DamageType.Bludgeoning,\n        cold: dnd_js_1.DamageType.Cold,\n        fire: dnd_js_1.DamageType.Fire,\n        force: dnd_js_1.DamageType.Force,\n        lightning: dnd_js_1.DamageType.Lightning,\n        necrotic: dnd_js_1.DamageType.Necrotic,\n        piercing: dnd_js_1.DamageType.Piercing,\n        poison: dnd_js_1.DamageType.Poison,\n        psychic: dnd_js_1.DamageType.Psychic,\n        radiant: dnd_js_1.DamageType.Radiant,\n        slashing: dnd_js_1.DamageType.Slashing,\n        thunder: dnd_js_1.DamageType.Thunder,\n    };\n    var eAttackType = attackTypes[attackType.toLowerCase()];\n    if (eAttackType == null) {\n        return \"\";\n    }\n    var eDamageType = damageTypes[damageType.toLowerCase()];\n    var eExtraDamageType = damageTypes[extraDamageType.toLowerCase()];\n    var eCondDamageType = damageTypes[condDamageType.toLowerCase()];\n    var eExtraCondDamageType = damageTypes[extraCondDamageType.toLowerCase()];\n    var output = [\n        \"//''\" + name + \".''//\",\n        dnd_js_1.weaponAttack(eAttackType, bonus, reach, range, target),\n        dnd_js_1.hit(damage, eDamageType, extraDamage, eExtraDamageType, condDamage, eCondDamageType, extraCondDamage, eExtraCondDamageType, when, effect),\n    ];\n    return output.join(\" \");\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.attack.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.average.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.average\";\nexports.params = [{ name: \"expr\" }];\nfunction run(expr) {\n    return dnd_js_1.average(expr);\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.average.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.check.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.check\";\nexports.params = [\n    { name: \"ability\" },\n    { name: \"skill\" },\n    { name: \"dc\" },\n];\nfunction run(ability, skill, dc) {\n    var nDC = Number.parseInt(dc, 10);\n    return dnd_js_1.check(ability, skill, nDC);\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.check.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.modifier.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.modifier\";\nexports.params = [{ name: \"score\" }];\nfunction run(score) {\n    var nScore = Number.parseInt(score, 10);\n    return dnd_js_1.modifier(nScore);\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.modifier.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.spellblock.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.spellblock\";\nexports.params = [\n    { name: \"level\" },\n    { name: \"school\" },\n    { name: \"cast\" },\n    { name: \"ritual\" },\n    { name: \"range\" },\n    { name: \"verbal\" },\n    { name: \"somatic\" },\n    { name: \"material\" },\n    { name: \"duration\" },\n];\nfunction run(level, school, cast, ritual, range, verbal, somatic, material, duration) {\n    var isRitual = ritual === \"true\";\n    var isSomatic = somatic === \"true\";\n    var isVerbal = verbal === \"true\";\n    var nLevel = Number.parseInt(level, 10);\n    var spell = new dnd_js_1.Spell(nLevel, school, cast, isRitual, range, isVerbal, isSomatic, material, duration);\n    return spell.render();\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.spellblock.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.statblock.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.statblock\";\nexports.params = [\n    // All monsters/NPCs have these attributes:\n    { name: \"size\" },\n    { name: \"type\" },\n    { name: \"alignment\" },\n    { name: \"ac\" },\n    { name: \"hp\" },\n    { name: \"speed\" },\n    { name: \"str\", default: 10 },\n    { name: \"dex\", default: 10 },\n    { name: \"con\", default: 10 },\n    { name: \"int\", default: 10 },\n    { name: \"wis\", default: 10 },\n    { name: \"cha\", default: 10 },\n    { name: \"senses\" },\n    { name: \"languages\", default: \"---\" },\n    { name: \"challenge\" },\n    // These attributes are optional:\n    { name: \"tags\" },\n    { name: \"saves\" },\n    { name: \"skills\" },\n    { name: \"dimm\" },\n    { name: \"dres\" },\n    { name: \"dvul\" },\n    { name: \"cimm\" },\n    { name: \"cres\" },\n    { name: \"cvul\" },\n];\nfunction run(size, type, alignment, ac, hp, speed, str, dex, con, int, wis, cha, senses, languages, challenge, tags, saves, skills, dimm, dres, dvul, cimm, cres, cvul) {\n    var nAC = Number.parseInt(ac, 10);\n    var nStr = Number.parseInt(str, 10);\n    var nDex = Number.parseInt(dex, 10);\n    var nCon = Number.parseInt(con, 10);\n    var nInt = Number.parseInt(int, 10);\n    var nWis = Number.parseInt(wis, 10);\n    var nCha = Number.parseInt(cha, 10);\n    var statblock = new dnd_js_1.StatBlock(size, type, alignment, nAC, hp, speed, nStr, nDex, nCon, nInt, nWis, nCha, senses, languages, challenge, tags, saves, skills, dimm, dres, dvul, cimm, cres, cvul);\n    return statblock.render();\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.statblock.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/modules/macros/dnd.xp.js": {
            "text": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar dnd_js_1 = require(\"$:/plugins/benwebber/dnd/dnd.js\");\nexports.name = \"dnd.xp\";\nexports.params = [\n    { name: \"rating\" },\n    { name: \"xp\" },\n];\nfunction run(rating, xp) {\n    var languageTitle = this.getVariable(\"languageTitle\");\n    var formatter = new Intl.NumberFormat(languageTitle);\n    // Try using user input directly. If `xp` is a number, use it.\n    var nXP = parseInt(xp, 10);\n    var hasXP = !Number.isNaN(nXP);\n    if (hasXP) {\n        return rating + \" (\" + formatter.format(nXP) + \" <<dnd._lingo XP>>)\";\n    }\n    // If `xp` is not a number or not defined, try using a standard score.\n    nXP = dnd_js_1.getXP(rating);\n    if (nXP != null) {\n        // Use standard scores (<<dnd.xp 5>>)\n        return rating + \" (\" + formatter.format(nXP) + \" <<dnd._lingo XP>>)\";\n    }\n    // Unknown rating: pass through (<<dnd.xp \"5 (800 XP)\">>).\n    return rating;\n}\nexports.run = run;\n",
            "title": "$:/plugins/benwebber/dnd/modules/macros/dnd.xp.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.spell": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.spell",
            "text": "\\define field-spell()\n\n<$macrocall\n  $name=\"dnd.spellblock\"\n  level={{!!dnd.spell.level}}\n  school={{!!dnd.spell.school}}\n  cast={{!!dnd.spell.cast}}\n  ritual={{!!dnd.spell.ritual}}\n  range={{!!dnd.spell.range}}\n  verbal={{!!dnd.spell.verbal}}\n  somatic={{!!dnd.spell.somatic}}\n  material={{!!dnd.spell.material}}\n  duration={{!!dnd.spell.duration}}\n/>\n\n\\end\n\n\\define data-spell()\n\n<$macrocall\n  $name=\"dnd.spellblock\"\n  level={{##level}}\n  school={{##school}}\n  cast={{##cast}}\n  ritual={{##ritual}}\n  range={{##range}}\n  components={{##components}}\n  verbal={{##verbal}}\n  somatic={{##somatic}}\n  material={{##material}}\n  duration={{##duration}}\n/>\n\n\\end\n\n<$reveal type=\"match\" state=\"!!type\" text=\"text/vnd.tiddlywiki\" default=\"text/vnd.tiddlywiki\">\n\n<<field-spell>>\n</$reveal>\n<$reveal type=\"match\" state=\"!!type\" text=\"application/x-tiddler-dictionary\">\n\n<<data-spell>>\n</$reveal>\n<$reveal type=\"match\" state=\"!!type\" text=\"application/json\">\n\n<<data-spell>>\n</$reveal>\n"
        },
        "$:/plugins/benwebber/dnd/templates/dnd.statblock": {
            "title": "$:/plugins/benwebber/dnd/templates/dnd.statblock",
            "text": "\\define field-statblock()\n\n<$macrocall\n  $name=\"dnd.statblock\"\n  size={{!!dnd.creature.size}}\n  type={{!!dnd.creature.type}}\n  tags={{!!dnd.creature.tags}}\n  alignment={{!!dnd.creature.alignment}}\n  ac={{!!dnd.creature.ac}}\n  hp={{!!dnd.creature.hp}}\n  speed={{!!dnd.creature.speed}}\n  str={{!!dnd.creature.str}}\n  dex={{!!dnd.creature.dex}}\n  con={{!!dnd.creature.con}}\n  int={{!!dnd.creature.int}}\n  wis={{!!dnd.creature.wis}}\n  cha={{!!dnd.creature.cha}}\n  saves={{!!dnd.creature.saves}}\n  skills={{!!dnd.creature.skills}}\n  dimm={{!!dnd.creature.dimm}}\n  dres={{!!dnd.creature.dres}}\n  dvul={{!!dnd.creature.dvul}}\n  cimm={{!!dnd.creature.cimm}}\n  cres={{!!dnd.creature.cres}}\n  cvul={{!!dnd.creature.cvul}}\n  senses={{!!dnd.creature.senses}}\n  languages={{!!dnd.creature.languages}}\n  challenge={{!!dnd.creature.challenge}}\n/>\n\n\\end\n\n\\define data-statblock()\n\n<$macrocall\n  $name=\"dnd.statblock\"\n  size={{##size}}\n  type={{##type}}\n  tags={{##tags}}\n  alignment={{##alignment}}\n  ac={{##ac}}\n  hp={{##hp}}\n  speed={{##speed}}\n  str={{##str}}\n  dex={{##dex}}\n  con={{##con}}\n  int={{##int}}\n  wis={{##wis}}\n  cha={{##cha}}\n  saves={{##saves}}\n  skills={{##skills}}\n  dimm={{##dimm}}\n  dres={{##dres}}\n  dvul={{##dvul}}\n  cimm={{##cimm}}\n  cres={{##cres}}\n  cvul={{##cvul}}\n  senses={{##senses}}\n  languages={{##languages}}\n  challenge={{##challenge}}\n/>\n\n\\end\n\n<$reveal type=\"match\" state=\"!!type\" text=\"text/vnd.tiddlywiki\" default=\"text/vnd.tiddlywiki\">\n\n<<field-statblock>>\n</$reveal>\n<$reveal type=\"match\" state=\"!!type\" text=\"application/x-tiddler-dictionary\">\n\n<<data-statblock>>\n</$reveal>\n<$reveal type=\"match\" state=\"!!type\" text=\"application/json\">\n\n<<data-statblock>>\n</$reveal>\n"
        },
        "$:/plugins/benwebber/dnd/ui/Buttons/new-creature": {
            "title": "$:/plugins/benwebber/dnd/ui/Buttons/new-creature",
            "tags": "$:/tags/PageControls",
            "text": "\\define actions()\n<$action-sendmessage\n  $message=\"tm-new-tiddler\"\n  title=<<title>>\n  tags={{$:/plugins/benwebber/dnd/config/Tags/Creatures}}\n/>\n\\end\n\n<$wikify name=\"text\" text=<<dnd._lingo Buttons/NewCreature/Text>>>\n<$wikify name=\"title\" text=<<dnd._lingo Buttons/NewCreature/Title>>>\n<$wikify name=\"tooltip\" text=<<dnd._lingo Buttons/NewCreature/Tooltip>>>\n<$button actions=<<actions>> class=<<tv-config-toolbar-class>> tooltip=<<tooltip>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/plugins/benwebber/dnd/images/new-creature}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text=<<text>>/></span>\n</$list>\n</$button>\n</$wikify>\n</$wikify>\n</$wikify>\n"
        },
        "$:/plugins/benwebber/dnd/ui/Buttons/new-spell": {
            "title": "$:/plugins/benwebber/dnd/ui/Buttons/new-spell",
            "tags": "$:/tags/PageControls",
            "text": "\\define actions()\n<$action-sendmessage\n  $message=\"tm-new-tiddler\"\n  title=<<title>>\n  tags={{$:/plugins/benwebber/dnd/config/Tags/Spells}}\n/>\n\\end\n\n<$wikify name=\"text\" text=<<dnd._lingo Buttons/NewSpell/Text>>>\n<$wikify name=\"title\" text=<<dnd._lingo Buttons/NewSpell/Title>>>\n<$wikify name=\"tooltip\" text=<<dnd._lingo Buttons/NewSpell/Tooltip>>>\n<$button actions=<<actions>> class=<<tv-config-toolbar-class>> tooltip=<<tooltip>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/plugins/benwebber/dnd/images/new-spell}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text=<<text>>/></span>\n</$list>\n</$button>\n</$wikify>\n</$wikify>\n</$wikify>\n"
        },
        "$:/plugins/benwebber/dnd/ui/Modals/UpdateCreature": {
            "title": "$:/plugins/benwebber/dnd/ui/Modals/UpdateCreature",
            "subtitle": "<<dnd._lingo Modals/Subtitle>>",
            "text": "\\define input(field)\n<$edit-text tag=input tiddler=<<tiddler>> field=<<__field__>> />\n\\end\n\n\\define select-size()\n<$select tiddler=<<tiddler>> field=\"dnd.creature.size\">\n  <option value=\"tiny\"><<dnd._lingo Creature/Size/Tiny>></option>\n  <option value=\"small\"><<dnd._lingo Creature/Size/Small>></option>\n  <option value=\"medium\"><<dnd._lingo Creature/Size/Medium>></option>\n  <option value=\"large\"><<dnd._lingo Creature/Size/Large>></option>\n  <option value=\"huge\"><<dnd._lingo Creature/Size/Huge>></option>\n  <option value=\"gargantuan\"><<dnd._lingo Creature/Size/Gargantuan>></option>\n</$select>\n\\end\n\n\\define select-type()\n<$select tiddler=<<tiddler>> field=\"dnd.creature.type\">\n  <option value=\"aberration\"><<dnd._lingo Creature/Type/Aberration>></option>\n  <option value=\"beast\"><<dnd._lingo Creature/Type/Beast>></option>\n  <option value=\"celestial\"><<dnd._lingo Creature/Type/Celestial>></option>\n  <option value=\"construct\"><<dnd._lingo Creature/Type/Construct>></option>\n  <option value=\"dragon\"><<dnd._lingo Creature/Type/Dragon>></option>\n  <option value=\"elemental\"><<dnd._lingo Creature/Type/Elemental>></option>\n  <option value=\"fey\"><<dnd._lingo Creature/Type/Fey>></option>\n  <option value=\"fiend\"><<dnd._lingo Creature/Type/Fiend>></option>\n  <option value=\"giant\"><<dnd._lingo Creature/Type/Giant>></option>\n  <option value=\"humanoid\"><<dnd._lingo Creature/Type/Humanoid>></option>\n  <option value=\"monstrosity\"><<dnd._lingo Creature/Type/Monstrosity>></option>\n  <option value=\"ooze\"><<dnd._lingo Creature/Type/Ooze>></option>\n  <option value=\"plant\"><<dnd._lingo Creature/Type/Plant>></option>\n  <option value=\"undead\"><<dnd._lingo Creature/Type/Undead>></option>\n</$select>\n\\end\n\n\\define select-ability(field)\n<$select tiddler=<<tiddler>> field=<<__field__>>>\n  <option value=\"1\"><<dnd.ability 1>></option>\n  <option value=\"2\"><<dnd.ability 2>></option>\n  <option value=\"3\"><<dnd.ability 3>></option>\n  <option value=\"4\"><<dnd.ability 4>></option>\n  <option value=\"5\"><<dnd.ability 5>></option>\n  <option value=\"6\"><<dnd.ability 6>></option>\n  <option value=\"7\"><<dnd.ability 7>></option>\n  <option value=\"8\"><<dnd.ability 8>></option>\n  <option value=\"9\"><<dnd.ability 9>></option>\n  <option value=\"10\"><<dnd.ability 10>></option>\n  <option value=\"11\"><<dnd.ability 11>></option>\n  <option value=\"12\"><<dnd.ability 12>></option>\n  <option value=\"13\"><<dnd.ability 13>></option>\n  <option value=\"14\"><<dnd.ability 14>></option>\n  <option value=\"15\"><<dnd.ability 15>></option>\n  <option value=\"16\"><<dnd.ability 16>></option>\n  <option value=\"17\"><<dnd.ability 17>></option>\n  <option value=\"18\"><<dnd.ability 18>></option>\n  <option value=\"19\"><<dnd.ability 19>></option>\n  <option value=\"20\"><<dnd.ability 20>></option>\n  <option value=\"21\"><<dnd.ability 21>></option>\n  <option value=\"22\"><<dnd.ability 22>></option>\n  <option value=\"23\"><<dnd.ability 23>></option>\n  <option value=\"24\"><<dnd.ability 24>></option>\n  <option value=\"25\"><<dnd.ability 25>></option>\n  <option value=\"26\"><<dnd.ability 26>></option>\n  <option value=\"27\"><<dnd.ability 27>></option>\n  <option value=\"28\"><<dnd.ability 28>></option>\n  <option value=\"29\"><<dnd.ability 29>></option>\n  <option value=\"30\"><<dnd.ability 30>></option>\n</$select>\n\\end\n\n\\define select-challenge()\n<$select tiddler=<<tiddler>> field=\"dnd.creature.challenge\">>\n  <option value=\"0\"><<dnd.xp \"0\">></option>\n  <option value=\"0 10\"><<dnd.xp \"0\" \"10\">></option>\n  <option value=\"1/8\"><<dnd.xp \"1/8\">></option>\n  <option value=\"1/4\"><<dnd.xp \"1/4\">></option>\n  <option value=\"1/2\"><<dnd.xp \"1/2\">></option>\n  <option value=\"1\"><<dnd.xp \"1\">></option>\n  <option value=\"2\"><<dnd.xp \"2\">></option>\n  <option value=\"3\"><<dnd.xp \"3\">></option>\n  <option value=\"4\"><<dnd.xp \"4\">></option>\n  <option value=\"5\"><<dnd.xp \"5\">></option>\n  <option value=\"6\"><<dnd.xp \"6\">></option>\n  <option value=\"7\"><<dnd.xp \"7\">></option>\n  <option value=\"8\"><<dnd.xp \"8\">></option>\n  <option value=\"9\"><<dnd.xp \"9\">></option>\n  <option value=\"10\"><<dnd.xp \"10\">></option>\n  <option value=\"11\"><<dnd.xp \"11\">></option>\n  <option value=\"12\"><<dnd.xp \"12\">></option>\n  <option value=\"13\"><<dnd.xp \"13\">></option>\n  <option value=\"14\"><<dnd.xp \"14\">></option>\n  <option value=\"15\"><<dnd.xp \"15\">></option>\n  <option value=\"16\"><<dnd.xp \"16\">></option>\n  <option value=\"17\"><<dnd.xp \"17\">></option>\n  <option value=\"18\"><<dnd.xp \"18\">></option>\n  <option value=\"19\"><<dnd.xp \"19\">></option>\n  <option value=\"20\"><<dnd.xp \"20\">></option>\n  <option value=\"21\"><<dnd.xp \"21\">></option>\n  <option value=\"22\"><<dnd.xp \"22\">></option>\n  <option value=\"23\"><<dnd.xp \"23\">></option>\n  <option value=\"24\"><<dnd.xp \"24\">></option>\n  <option value=\"25\"><<dnd.xp \"25\">></option>\n  <option value=\"26\"><<dnd.xp \"26\">></option>\n  <option value=\"27\"><<dnd.xp \"27\">></option>\n  <option value=\"28\"><<dnd.xp \"28\">></option>\n  <option value=\"29\"><<dnd.xp \"29\">></option>\n  <option value=\"30\"><<dnd.xp \"30\">></option>\n</$select>\n\\end\n\n<<dnd._lingo Modals/Help>>\n\n|!<<dnd._lingo StatBlock/Size>> |<<select-size>> |\n|!<<dnd._lingo StatBlock/Type>> |<<select-type>> |\n|!<<dnd._lingo StatBlock/Tags>> |<<input dnd.creature.tags>> |\n|!<<dnd._lingo StatBlock/Alignment>> |<<input dnd.creature.alignment>> |\n\n---\n\n|!<<dnd._lingo StatBlock/AC>> |<<input dnd.creature.ac>> |\n|!<<dnd._lingo StatBlock/HP>> |<<input dnd.creature.hp>> |\n|!<<dnd._lingo StatBlock/Speed>> |<<input dnd.creature.speed>> |\n\n---\n\n| <<dnd._lingo StatBlock/STR>> | <<dnd._lingo StatBlock/DEX>> | <<dnd._lingo StatBlock/CON>> | <<dnd._lingo StatBlock/INT>> | <<dnd._lingo StatBlock/WIS>> | <<dnd._lingo StatBlock/CHA>> |h\n| <<select-ability dnd.creature.str>> | <<select-ability dnd.creature.dex>> | <<select-ability dnd.creature.con>> | <<select-ability dnd.creature.int>> | <<select-ability dnd.creature.wis>> | <<select-ability dnd.creature.cha>> |\n\n---\n\n|!<<dnd._lingo StatBlock/SavingThrows>> |<<input dnd.creature.saves>> |\n|!<<dnd._lingo StatBlock/Skills>> |<<input dnd.creature.skills>> |\n|!<<dnd._lingo StatBlock/DamageImmunities>> |<<input dnd.creature.dimm>> |\n|!<<dnd._lingo StatBlock/DamageResistances>> |<<input dnd.creature.dres>> |\n|!<<dnd._lingo StatBlock/DamageVulnerabilities>> |<<input dnd.creature.dvul>> |\n|!<<dnd._lingo StatBlock/ConditionImmunities>> |<<input dnd.creature.cimm>> |\n|!<<dnd._lingo StatBlock/ConditionResistances>> |<<input dnd.creature.cres>> |\n|!<<dnd._lingo StatBlock/ConditionVulnerabilities>> |<<input dnd.creature.cvul>> |\n|!<<dnd._lingo StatBlock/Senses>> |<<input dnd.creature.senses>> |\n|!<<dnd._lingo StatBlock/Languages>> |<<input dnd.creature.languages>> |\n|!<<dnd._lingo StatBlock/Challenge>> |<<select-challenge>> |\n"
        },
        "$:/plugins/benwebber/dnd/ui/Modals/UpdateSpell": {
            "title": "$:/plugins/benwebber/dnd/ui/Modals/UpdateSpell",
            "subtitle": "<<dnd._lingo Modals/Subtitle>>",
            "text": "\\define input(field)\n<$edit-text tag=input tiddler=<<tiddler>> field=<<__field__>> />\n\\end\n\n\\define select-level(field)\n<$select tiddler=<<tiddler>> field=\"dnd.spell.level\">\n  <option>0</option>\n  <option>1</option>\n  <option>2</option>\n  <option>3</option>\n  <option>4</option>\n  <option>5</option>\n  <option>6</option>\n  <option>7</option>\n  <option>8</option>\n  <option>9</option>\n</$select>\n\\end\n\n\\define select-school()\n<$select tiddler=<<tiddler>> field=\"dnd.spell.school\">\n  <option value=\"abjuration\"><<dnd._lingo Spell/School/Abjuration>></option>\n  <option value=\"conjuration\"><<dnd._lingo Spell/School/Conjuration>></option>\n  <option value=\"divination\"><<dnd._lingo Spell/School/Divination>></option>\n  <option value=\"enchantment\"><<dnd._lingo Spell/School/Enchantment>></option>\n  <option value=\"evocation\"><<dnd._lingo Spell/School/Evocation>></option>\n  <option value=\"illusion\"><<dnd._lingo Spell/School/Illusion>></option>\n  <option value=\"necromancy\"><<dnd._lingo Spell/School/Necromancy>></option>\n  <option value=\"transmutation\"><<dnd._lingo Spell/School/Transmutation>></option>\n</$select>\n\\end\n\n<<dnd._lingo Modals/Help>>\n\n|!<<dnd._lingo Spell/Level>> |<<select-level>> |\n|!<<dnd._lingo Spell/School>> |<<select-school>> |\n|!<<dnd._lingo Spell/CastingTime>> |<<input dnd.spell.cast>> <$checkbox tiddler=<<tiddler>> field=\"dnd.spell.ritual\" checked=\"true\" unchecked=\"\" default=\"\"> <<dnd._lingo Spell/Ritual>></$checkbox> |\n|!<<dnd._lingo Spell/Range>> |<<input dnd.spell.range>> |\n|!<<dnd._lingo Spell/Duration>> |<<input dnd.spell.duration>> |\n|!<<dnd._lingo Spell/Components>> |<$checkbox tiddler=<<tiddler>> field=\"dnd.spell.verbal\" checked=\"true\" unchecked=\"\" default=\"\"> <<dnd._lingo Spell/Verbal>></$checkbox> <$checkbox tiddler=<<tiddler>> field=\"dnd.spell.somatic\" checked=\"true\" unchecked=\"\" default=\"\"> <<dnd._lingo Spell/Somatic>></$checkbox> <<dnd._lingo Spell/Material>>: <<input dnd.spell.material>> |\n"
        },
        "$:/plugins/benwebber/dnd/ui/ViewTemplate/spell": {
            "title": "$:/plugins/benwebber/dnd/ui/ViewTemplate/spell",
            "tags": "$:/tags/ViewTemplate",
            "list-before": "$:/core/ui/ViewTemplate/body",
            "text": "<!-- Check tiddler tag. -->\n<$list filter=\"[<currentTiddler>tag{$:/plugins/benwebber/dnd/config/Tags/Spells}]\">\n<!-- Check if user enabled view template; don't override <<currentTiddler>>. -->\n<$list\n  filter=\"[title[$:/plugins/benwebber/dnd/config/ViewTemplates/Spell]field:text[true]]\"\n  variable=\"noop\"\n>\n\n<<dnd.spell>>\n</$list>\n</$list>\n"
        },
        "$:/plugins/benwebber/dnd/ui/ViewTemplate/statblock": {
            "title": "$:/plugins/benwebber/dnd/ui/ViewTemplate/statblock",
            "tags": "$:/tags/ViewTemplate",
            "list-before": "$:/core/ui/ViewTemplate/body",
            "text": "<!-- Check tiddler tag. -->\n<$list filter=\"[<currentTiddler>tag{$:/plugins/benwebber/dnd/config/Tags/Creatures}]\">\n<!-- Check if user enabled view template; don't override <<currentTiddler>>. -->\n<$list\n  filter=\"[title[$:/plugins/benwebber/dnd/config/ViewTemplates/StatBlock]field:text[true]]\"\n  variable=\"noop\"\n>\n\n<<dnd.creature>>\n</$list>\n</$list>\n"
        }
    }
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/* tslint:disable:object-literal-sort-keys */
var CR_TO_XP = {
    "0": 0,
    "1/8": 25,
    "1/4": 50,
    "1/2": 100,
    "1": 200,
    "2": 450,
    "3": 700,
    "4": 1100,
    "5": 1800,
    "6": 2300,
    "7": 2900,
    "8": 3900,
    "9": 5000,
    "10": 5900,
    "11": 7200,
    "12": 8400,
    "13": 10000,
    "14": 11500,
    "15": 13000,
    "16": 15000,
    "17": 18000,
    "18": 20000,
    "19": 22000,
    "20": 25000,
    "21": 33000,
    "22": 41000,
    "23": 50000,
    "24": 62000,
    "25": 75000,
    "26": 90000,
    "27": 105000,
    "28": 120000,
    "29": 135000,
    "30": 155000,
};
/* tslint:enable */
var SKILL_CODES_TO_CAPTIONS = {
    ac: "Acrobatics",
    an: "AnimalHandling",
    ar: "Arcana",
    at: "Athletics",
    d: "Deception",
    h: "History",
    ins: "Insight",
    int: "Intimidation",
    inv: "Investigation",
    m: "Medicine",
    n: "Nature",
    perc: "Perception",
    perf: "Performance",
    pers: "Persuasion",
    r: "Religion",
    sl: "SleightOfHand",
    st: "Stealth",
    su: "Survival",
};
var ABILITY_REGEX = /^(STR|DEX|CON|INT|WIS|CHA).*/i;
var SKILL_REGEX = new RegExp("^(" + Object.keys(SKILL_CODES_TO_CAPTIONS).join("|") + ").*", "i");
var AttackType;
(function (AttackType) {
    AttackType[AttackType["Melee"] = 0] = "Melee";
    AttackType[AttackType["Ranged"] = 1] = "Ranged";
    AttackType[AttackType["MeleeOrRanged"] = 2] = "MeleeOrRanged";
})(AttackType = exports.AttackType || (exports.AttackType = {}));
var DamageType;
(function (DamageType) {
    DamageType["Acid"] = "<<dnd._lingo Damage/Type/Acid>>";
    DamageType["Bludgeoning"] = "<<dnd._lingo Damage/Type/Bludgeoning>>";
    DamageType["Cold"] = "<<dnd._lingo Damage/Type/Cold>>";
    DamageType["Fire"] = "<<dnd._lingo Damage/Type/Fire>>";
    DamageType["Force"] = "<<dnd._lingo Damage/Type/Force>>";
    DamageType["Lightning"] = "<<dnd._lingo Damage/Type/Lightning>>";
    DamageType["Necrotic"] = "<<dnd._lingo Damage/Type/Necrotic>>";
    DamageType["Piercing"] = "<<dnd._lingo Damage/Type/Piercing>>";
    DamageType["Poison"] = "<<dnd._lingo Damage/Type/Poison>>";
    DamageType["Psychic"] = "<<dnd._lingo Damage/Type/Psychic>>";
    DamageType["Radiant"] = "<<dnd._lingo Damage/Type/Radiant>>";
    DamageType["Slashing"] = "<<dnd._lingo Damage/Type/Slashing>>";
    DamageType["Thunder"] = "<<dnd._lingo Damage/Type/Thunder>>";
})(DamageType = exports.DamageType || (exports.DamageType = {}));
var Spell = /** @class */ (function () {
    function Spell(level, school, cast, ritual, range, verbal, somatic, material, duration) {
        this.level = level;
        this.school = school;
        this.cast = cast;
        this.ritual = ritual;
        this.range = range;
        this.verbal = verbal;
        this.somatic = somatic;
        this.material = material;
        this.duration = duration;
    }
    Object.defineProperty(Spell.prototype, "isCantrip", {
        get: function () {
            return !isNaN(this.level) && this.level === 0;
        },
        enumerable: true,
        configurable: true
    });
    Spell.prototype.render = function () {
        var descriptionLevel = Number.isNaN(this.level) ? "" : this.level;
        var output = [
            "//<<dnd._spellDescription level:\"" + descriptionLevel + "\" school:\"" + this.school + "\" ritual:\"" + this.ritual + "\">>//",
            "",
        ];
        var componentFragments = [];
        if (this.verbal) {
            componentFragments.push("<<dnd._lingo Spell/Verbal>>");
        }
        if (this.somatic) {
            componentFragments.push("<<dnd._lingo Spell/Somatic>>");
        }
        if (this.material) {
            componentFragments.push("<<dnd._lingo Spell/Material>> (" + this.material + ")");
        }
        var components = componentFragments.join(", ");
        var fields = [
            { caption: "Spell/CastingTime", value: this.cast },
            { caption: "Spell/Range", value: this.range },
            { caption: "Spell/Components", value: components },
            { caption: "Spell/Duration", value: this.duration },
        ];
        output = output.concat(renderFields(fields, true));
        output.push("");
        return output.join("\n");
    };
    return Spell;
}());
exports.Spell = Spell;
var StatBlock = /** @class */ (function () {
    function StatBlock(size, type, alignment, ac, hp, speed, str, dex, con, int, wis, cha, senses, languages, challenge, tags, saves, skills, dimm, dres, dvul, cimm, cres, cvul) {
        this.size = size;
        this.type = type;
        this.alignment = alignment;
        this.ac = ac;
        this.hp = hp;
        this.speed = speed;
        this.str = str;
        this.dex = dex;
        this.con = con;
        this.int = int;
        this.wis = wis;
        this.cha = cha;
        this.senses = senses;
        this.languages = languages;
        this.challenge = challenge;
        this.tags = tags;
        this.saves = saves;
        this.skills = skills;
        this.dimm = dimm;
        this.dres = dres;
        this.dvul = dvul;
        this.cimm = cimm;
        this.cres = cres;
        this.cvul = cvul;
    }
    Object.defineProperty(StatBlock.prototype, "description", {
        get: function () {
            // TODO: Translate stored size, type values in description.
            var descriptionFragments = [this.size, this.type];
            if (this.tags) {
                descriptionFragments.push(this.renderTags(this.tags));
            }
            var description = descriptionFragments.join(" ").trim();
            if (this.alignment) {
                description = description + ", " + this.alignment;
            }
            return description;
        },
        enumerable: true,
        configurable: true
    });
    StatBlock.prototype.render = function () {
        var output = [
            "//" + capitalize(this.description) + "//",
            "",
        ];
        var fields = [
            { caption: "StatBlock/AC", value: this.ac },
            { caption: "StatBlock/HP", value: average(this.hp) },
            { caption: "StatBlock/Speed", value: this.speed },
        ];
        output = output.concat(renderFields(fields, true));
        output.push("");
        output.push("---");
        var abilities = [
            { caption: "StatBlock/STR", value: this.str },
            { caption: "StatBlock/DEX", value: this.dex },
            { caption: "StatBlock/CON", value: this.con },
            { caption: "StatBlock/INT", value: this.int },
            { caption: "StatBlock/WIS", value: this.wis },
            { caption: "StatBlock/CHA", value: this.cha },
        ];
        output = output.concat(this.renderAbilities(abilities));
        output.push("");
        output.push("---");
        fields = [
            { caption: "StatBlock/Saves", value: this.saves },
            { caption: "StatBlock/Skills", value: this.skills },
            { caption: "StatBlock/DamageImmunities", value: this.dimm },
            { caption: "StatBlock/DamageResistances", value: this.dres },
            { caption: "StatBlock/DamageVulnerabilities", value: this.dvul },
            { caption: "StatBlock/ConditionImmunities", value: this.cimm },
            { caption: "StatBlock/ConditionResistances", value: this.cres },
            { caption: "StatBlock/ConditionVulnerabilities", value: this.cvul },
        ];
        output = output.concat(renderFields(fields, false));
        // Does the challenge field embed XP?
        var challengeRegexp = /(\d+)\s+(\d+)?/;
        var challengeMatch = this.challenge.match(challengeRegexp);
        var challengeMacro = "<<dnd.xp \"" + this.challenge + "\">>";
        if (challengeMatch && challengeMatch[2]) {
            challengeMacro = "<<dnd.xp \"" + challengeMatch[1] + "\" \"" + challengeMatch[2] + "\">>";
        }
        fields = [
            { caption: "StatBlock/Senses", value: this.senses },
            { caption: "StatBlock/Languages", value: this.languages },
            { caption: "StatBlock/Challenge", value: challengeMacro },
        ];
        output = output.concat(renderFields(fields, true));
        output.push("");
        output.push("---");
        return output.join("\n");
    };
    StatBlock.prototype.renderTags = function (tags) {
        return tags ? "(" + tags + ")" : "";
    };
    StatBlock.prototype.renderAbilities = function (abilities) {
        return [
            "| " + abilities.map(function (field) { return "<<dnd._lingo " + field.caption + ">>"; }).join(" | ") + " |h",
            "| " + abilities.map(function (field) { return ability(field.value); }).join(" | ") + " |",
        ];
    };
    return StatBlock;
}());
exports.StatBlock = StatBlock;
function ability(score) {
    return score + " (" + modifier(score) + ")";
}
exports.ability = ability;
function modifier(score) {
    var mod = Math.floor((score - 10) / 2);
    var op = (mod >= 0) ? "+" : "−"; // minus sign (U+2212)
    return "" + op + Math.abs(mod);
}
exports.modifier = modifier;
function average(expr) {
    var regexp = /^(\d+)?d(\d+)\s?(?:(-|\+)\s?(\d+))?$/i;
    var match = expr.match(regexp);
    if (!match) {
        return expr;
    }
    var nDice = parseInt(match[1], 10) || 1;
    var nSides = parseInt(match[2], 10);
    var op = match[3];
    var mod = parseInt(match[4], 10) || 0;
    var avg;
    if (!op) {
        avg = Math.floor(nDice * (1 + nSides) / 2 + mod);
        return avg + " (" + nDice + "d" + nSides + ")";
    }
    if (op === "+") {
        avg = Math.floor(nDice * (1 + nSides) / 2 + mod);
    }
    else {
        op = "−";
        avg = Math.floor(nDice * (1 + nSides) / 2 - mod);
    }
    return avg + " (" + nDice + "d" + nSides + " " + op + " " + mod + ")";
}
exports.average = average;
function capitalize(s) {
    return s.charAt(0).toLocaleUpperCase() + s.slice(1);
}
exports.capitalize = capitalize;
// tslint:disable-next-line:no-shadowed-variable
function check(ability, skill, dc) {
    var abilityMatch = ability.match(ABILITY_REGEX);
    if (!abilityMatch) {
        return "";
    }
    var abilityCode = abilityMatch[1].toLocaleUpperCase();
    var fragments = ["<<dnd._lingo Ability/" + abilityCode + ">>"];
    if (skill) {
        var skillMatch = skill.match(SKILL_REGEX);
        if (skillMatch) {
            var skillCode = skillMatch[1].toLocaleLowerCase();
            fragments.push("(<<dnd._lingo Skill/" + SKILL_CODES_TO_CAPTIONS[skillCode] + ">>)");
        }
    }
    if (dc) {
        fragments.unshift("<<dnd._lingo Check/DC>> " + dc);
    }
    return fragments.join(" ");
}
exports.check = check;
function renderFields(fields, alwaysRender) {
    var output = [];
    for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
        var field = fields_1[_i];
        if (alwaysRender || field.value) {
            output.push("|!<<dnd._lingo " + field.caption + ">> |" + field.value + " |");
        }
    }
    return output;
}
function getXP(rating) {
    rating = rating.replace(/['"]/g, "");
    return CR_TO_XP[rating];
}
exports.getXP = getXP;
function hit(damage, damageType, extraDamage, extraDamageType, condDamage, condDamageType, extraCondDamage, extraCondDamageType, when, effect) {
    var buffer = ["//<<dnd._lingo StatBlock/Action/Hit>>://"];
    buffer.push(renderDamage(damage, damageType, extraDamage, extraDamageType));
    var or = "";
    if (condDamage && condDamageType && when) {
        or = renderDamage(condDamage, condDamageType, extraCondDamage, extraCondDamageType) + " " + when;
    }
    var output = buffer.join(" ");
    if (or) {
        output = output + ", <<dnd._lingo StatBlock/Action/Or>> " + or;
    }
    if (effect) {
        output = output + ", " + effect;
    }
    return output + ".";
}
exports.hit = hit;
function renderDamage(damage, damageType, extraDamage, extraDamageType) {
    var buffer = [
        average(damage),
        damageType,
    ];
    if (extraDamage && extraDamageType) {
        buffer = buffer.concat([
            "<<dnd._lingo StatBlock/Action/Plus>>",
            average(extraDamage),
            extraDamageType,
        ]);
    }
    return buffer.join(" ");
}
function weaponAttack(attackType, bonus, reach, range, target) {
    var _a;
    // tslint:disable max-line-length
    var attackTypesToCaptions = (_a = {},
        _a[AttackType.Melee] = {
            attack: "<<dnd._lingo StatBlock/Action/Melee>>",
            reachOrRange: "<<dnd._lingo StatBlock/Action/Reach>> " + reach,
        },
        _a[AttackType.Ranged] = {
            attack: "<<dnd._lingo StatBlock/Action/Ranged>>",
            reachOrRange: "<<dnd._lingo StatBlock/Action/Range>> " + range,
        },
        _a[AttackType.MeleeOrRanged] = {
            attack: "<<dnd._lingo StatBlock/Action/MeleeOrRanged>>",
            reachOrRange: "<<dnd._lingo StatBlock/Action/Reach>> " + reach + " <<dnd._lingo StatBlock/Action/Or>> <<dnd._lingo StatBlock/Action/Range>> " + range,
        },
        _a);
    var captions = attackTypesToCaptions[attackType];
    var output = [
        "//" + captions.attack + ":// " + bonus + " <<dnd._lingo StatBlock/Action/ToHit>>",
        captions.reachOrRange,
        target || "<<dnd._lingo StatBlock/Action/DefaultTarget>>",
    ];
    return output.join(", ") + ".";
}
exports.weaponAttack = weaponAttack;
\define actions()
<$action-sendmessage
  $message="tm-new-tiddler"
  title=<<title>>
  tags={{$:/plugins/benwebber/dnd/config/Tags/Creatures}}
/>
\end

<$wikify name="text" text=<<dnd._lingo Buttons/NewCreature/Text>>>
<$wikify name="title" text=<<dnd._lingo Buttons/NewCreature/Title>>>
<$wikify name="tooltip" text=<<dnd._lingo Buttons/NewCreature/Tooltip>>>
<$button actions=<<actions>> class=<<tv-config-toolbar-class>> tooltip=<<tooltip>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/plugins/benwebber/dnd/images/new-creature}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text=<<text>>/></span>
</$list>
</$button>
</$wikify>
</$wikify>
</$wikify>
\define actions()
<$action-sendmessage
  $message="tm-new-tiddler"
  title=<<title>>
  tags={{$:/plugins/benwebber/dnd/config/Tags/Spells}}
/>
\end

<$wikify name="text" text=<<dnd._lingo Buttons/NewSpell/Text>>>
<$wikify name="title" text=<<dnd._lingo Buttons/NewSpell/Title>>>
<$wikify name="tooltip" text=<<dnd._lingo Buttons/NewSpell/Tooltip>>>
<$button actions=<<actions>> class=<<tv-config-toolbar-class>> tooltip=<<tooltip>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/plugins/benwebber/dnd/images/new-spell}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text=<<text>>/></span>
</$list>
</$button>
</$wikify>
</$wikify>
</$wikify>
{
    "tiddlers": {
        "$:/plugins/mklauber/math.js/calc.js": {
            "text": "/*\\\ntitle: $:/plugins/mklauber/math.js/calc.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar math = require(\"$:/plugins/mklauber/math.js/math.js\");\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CalcWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCalcWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCalcWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\n\tthis.expression = this.document.createElement(\"div\");\n\tthis.renderChildren(this.expression);\n\t\n\tvar text = \"\";\n\ttry {\n\t\ttext = math.eval(this.expression.textContent.trim());\n\t} catch(err) {\n\t\tif(!this.silence){\n\t\t\ttext = \"Unable to parse '\" + this.expression.textContent + \"'\";\n\t\t}\n\t}\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCalcWidget.prototype.execute = function() {\n\tthis.silence = this.getAttribute(\"silence\",false);\n\tvar calc = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tthis.makeChildWidgets([calc]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCalcWidget.prototype.refresh = function(changedTiddlers) {\n\tif(this.refreshChildren(changedTiddlers)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nexports.calc = CalcWidget;\n\n})();\n",
            "title": "$:/plugins/mklauber/math.js/calc.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/mklauber/math.js/math.js": {
            "text": "/*\\\ntitle: $:/plugins/mklauber/math.js/math.js\ntype: application/javascript\nmodule-type: library\n\\*/\n/**\n * math.js\n * https://github.com/josdejong/mathjs\n *\n * Math.js is an extensive math library for JavaScript and Node.js,\n * It features real and complex numbers, units, matrices, a large set of\n * mathematical functions, and a flexible expression parser.\n *\n * @version 2.4.1\n * @date    2015-10-29\n *\n * @license\n * Copyright (C) 2013-2015 Jos de Jong <wjosdejong@gmail.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.math=t():e.math=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return e[n].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var r={};return t.m=e,t.c=r,t.p=\"\",t(0)}([function(e,t,r){function n(e){var t=i.create(e);return t.create=n,t[\"import\"](r(13)),t}var i=r(1);e.exports=n()},function(e,t,r){e.exports=r(2)},function(e,t,r){var n=r(3).isFactory,i=r(3).deepExtend,a=r(4),o=r(8),s=r(10),u=r(12);t.create=function(e){function t(e){if(!n(e))throw new Error(\"Factory object with properties `type`, `name`, and `factory` expected\");var i,a=r.indexOf(e);return-1===a?(i=e.math===!0?e.factory(f.type,l,t,f.typed,f):e.factory(f.type,l,t,f.typed),r.push(e),c.push(i)):i=c[a],i}if(\"function\"!=typeof Object.create)throw new Error(\"ES5 not supported by this JavaScript engine. Please load the es5-shim and es5-sham library for compatibility.\");var r=[],c=[],f=o.mixin({});f.type={},f.expression={transform:Object.create(f)},f.typed=a.create(f.type);var l={epsilon:1e-14,matrix:\"matrix\",number:\"number\",precision:64,predictable:!1};return e&&i(l,e),f[\"import\"]=t(s),f.config=t(u),f}},function(e,t){\"use strict\";t.clone=function r(e){var t=typeof e;if(\"number\"===t||\"string\"===t||\"boolean\"===t||null===e||void 0===e)return e;if(\"function\"==typeof e.clone)return e.clone();if(Array.isArray(e))return e.map(function(e){return r(e)});if(e instanceof Number)return new Number(e.valueOf());if(e instanceof String)return new String(e.valueOf());if(e instanceof Boolean)return new Boolean(e.valueOf());if(e instanceof Date)return new Date(e.valueOf());if(e&&e.isBigNumber===!0)return e;if(e instanceof RegExp)throw new TypeError(\"Cannot clone \"+e);var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=r(e[i]));return n},t.extend=function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e},t.deepExtend=function n(e,t){if(Array.isArray(t))throw new TypeError(\"Arrays are not supported by deepExtend\");for(var r in t)if(t.hasOwnProperty(r))if(t[r]&&t[r].constructor===Object)void 0===e[r]&&(e[r]={}),e[r].constructor===Object?n(e[r],t[r]):e[r]=t[r];else{if(Array.isArray(t[r]))throw new TypeError(\"Arrays are not supported by deepExtend\");e[r]=t[r]}return e},t.deepEqual=function(e,r){var n,i,a;if(Array.isArray(e)){if(!Array.isArray(r))return!1;if(e.length!=r.length)return!1;for(i=0,a=e.length;a>i;i++)if(!t.deepEqual(e[i],r[i]))return!1;return!0}if(e instanceof Object){if(Array.isArray(r)||!(r instanceof Object))return!1;for(n in e)if(!t.deepEqual(e[n],r[n]))return!1;for(n in r)if(!t.deepEqual(e[n],r[n]))return!1;return!0}return typeof e==typeof r&&e==r},t.canDefineProperty=function(){try{if(Object.defineProperty)return Object.defineProperty({},\"x\",{get:function(){}}),!0}catch(e){}return!1},t.lazy=function(e,r,n){if(t.canDefineProperty()){var i,a=!0;Object.defineProperty(e,r,{get:function(){return a&&(i=n(),a=!1),i},set:function(e){i=e,a=!1},configurable:!0,enumerable:!0})}else e[r]=n()},t.traverse=function(e,t){var r=e;if(t)for(var n=t.split(\".\"),i=0;i<n.length;i++){var a=n[i];a in r||(r[a]={}),r=r[a]}return r},t.isFactory=function(e){return e&&\"function\"==typeof e.factory}},function(e,t,r){var n=r(5),i=r(6).digits,a=function(){return a=n.create,n};t.create=function(e){var t=a();return t.types=[{name:\"number\",test:function(e){return\"number\"==typeof e}},{name:\"Complex\",test:function(e){return e&&e.isComplex}},{name:\"BigNumber\",test:function(e){return e&&e.isBigNumber}},{name:\"Fraction\",test:function(e){return e&&e.isFraction}},{name:\"Unit\",test:function(e){return e&&e.isUnit}},{name:\"string\",test:function(e){return\"string\"==typeof e}},{name:\"Array\",test:Array.isArray},{name:\"Matrix\",test:function(e){return e&&e.isMatrix}},{name:\"DenseMatrix\",test:function(e){return e&&e.isDenseMatrix}},{name:\"SparseMatrix\",test:function(e){return e&&e.isSparseMatrix}},{name:\"ImmutableDenseMatrix\",test:function(e){return e&&e.isImmutableDenseMatrix}},{name:\"Range\",test:function(e){return e&&e.isRange}},{name:\"Index\",test:function(e){return e&&e.isIndex}},{name:\"boolean\",test:function(e){return\"boolean\"==typeof e}},{name:\"ResultSet\",test:function(e){return e&&e.isResultSet}},{name:\"Help\",test:function(e){return e&&e.isHelp}},{name:\"function\",test:function(e){return\"function\"==typeof e}},{name:\"Date\",test:function(e){return e instanceof Date}},{name:\"RegExp\",test:function(e){return e instanceof RegExp}},{name:\"Object\",test:function(e){return\"object\"==typeof e}},{name:\"null\",test:function(e){return null===e}},{name:\"undefined\",test:function(e){return void 0===e}}],t.conversions=[{from:\"number\",to:\"BigNumber\",convert:function(t){if(i(t)>15)throw new TypeError(\"Cannot implicitly convert a number with >15 significant digits to BigNumber (value: \"+t+\"). Use function bignumber(x) to convert to BigNumber.\");return new e.BigNumber(t)}},{from:\"number\",to:\"Complex\",convert:function(t){return new e.Complex(t,0)}},{from:\"number\",to:\"string\",convert:function(e){return e+\"\"}},{from:\"BigNumber\",to:\"Complex\",convert:function(t){return new e.Complex(t.toNumber(),0)}},{from:\"number\",to:\"Fraction\",convert:function(t){if(i(t)>15)throw new TypeError(\"Cannot implicitly convert a number with >15 significant digits to Fraction (value: \"+t+\"). Use function fraction(x) to convert to Fraction.\");return new e.Fraction(t)}},{from:\"string\",to:\"number\",convert:function(e){var t=Number(e);if(isNaN(t))throw new Error('Cannot convert \"'+e+'\" to a number');return t}},{from:\"boolean\",to:\"number\",convert:function(e){return+e}},{from:\"boolean\",to:\"BigNumber\",convert:function(t){return new e.BigNumber(+t)}},{from:\"boolean\",to:\"string\",convert:function(e){return+e}},{from:\"null\",to:\"number\",convert:function(){return 0}},{from:\"null\",to:\"string\",convert:function(){return\"null\"}},{from:\"null\",to:\"BigNumber\",convert:function(){return new e.BigNumber(0)}},{from:\"Array\",to:\"Matrix\",convert:function(t){return new e.DenseMatrix(t)}},{from:\"Matrix\",to:\"Array\",convert:function(e){return e.valueOf()}}],t}},function(e,t,r){var n,i,a;!function(r){i=[],n=r,a=\"function\"==typeof n?n.apply(t,i):n,!(void 0!==a&&(e.exports=a))}(function(){function e(){function t(e){for(var t,r=0;r<N.types.length;r++){var n=N.types[r];if(n.name===e){t=n.test;break}}if(!t){var i;for(r=0;r<N.types.length;r++)if(n=N.types[r],n.name.toLowerCase()==e.toLowerCase()){i=n.name;break}throw new Error('Unknown type \"'+e+'\"'+(i?'. Did you mean \"'+i+'\"?':\"\"))}return t}function r(e){for(var t=\"\",r=0;r<e.length;r++){var n=e[r];if(\"\"!=n.name)if(\"\"==t)t=n.name;else if(t!=n.name){var i=new Error(\"Function names do not match (expected: \"+t+\", actual: \"+n.name+\")\");throw i.data={actual:n.name,expected:t},i}}return t}function n(e,t,r,n,i){var a,o=h(n),s=i?i.split(\",\"):null,u=e||\"unnamed\",c=s&&g(s,\"any\"),f={fn:e,index:r,actual:n,expected:s};a=s?t>r&&!c?\"Unexpected type of argument in function \"+u+\" (expected: \"+s.join(\" or \")+\", actual: \"+o+\", index: \"+r+\")\":\"Too few arguments in function \"+u+\" (expected: \"+s.join(\" or \")+\", index: \"+r+\")\":\"Too many arguments in function \"+u+\" (expected: \"+r+\", actual: \"+t+\")\";var l=new TypeError(a);return l.data=f,l}function i(e){this.name=e||\"refs\",this.categories={}}function a(e,t){if(\"string\"==typeof e){var r=e.trim(),n=\"...\"===r.substr(0,3);if(n&&(r=r.substr(3)),\"\"===r)this.types=[\"any\"];else{this.types=r.split(\"|\");for(var i=0;i<this.types.length;i++)this.types[i]=this.types[i].trim()}}else{if(!Array.isArray(e)){if(e instanceof a)return e.clone();throw new Error(\"String or Array expected\")}this.types=e}this.conversions=[],this.varArgs=n||t||!1,this.anyType=-1!==this.types.indexOf(\"any\")}function o(e,t){var r;if(\"string\"==typeof e)r=\"\"!==e?e.split(\",\"):[];else{if(!Array.isArray(e))throw new Error(\"string or Array expected\");r=e}this.params=new Array(r.length);for(var n=0;n<r.length;n++){var i=new a(r[n]);if(this.params[n]=i,n===r.length-1)this.varArgs=i.varArgs;else if(i.varArgs)throw new SyntaxError('Unexpected variable arguments operator \"...\"')}this.fn=t}function s(e,t,r){this.path=e||[],this.param=e[e.length-1]||null,this.signature=t||null,this.childs=r||[]}function u(e){var t,r,n={},i=[];for(var a in e)if(e.hasOwnProperty(a)){var s=e[a];if(t=new o(a,s),t.ignore())continue;var u=t.expand();for(r=0;r<u.length;r++){var c=u[r],f=c.toString(),l=n[f];if(l){var p=o.compare(c,l);if(0>p)n[f]=c;else if(0===p)throw new Error('Signature \"'+f+'\" is defined twice')}else n[f]=c}}for(f in n)n.hasOwnProperty(f)&&i.push(n[f]);for(i.sort(function(e,t){return o.compare(e,t)}),r=0;r<i.length;r++)if(t=i[r],t.varArgs)for(var m=t.params.length-1,h=t.params[m],v=0;v<h.types.length;){if(h.conversions[v])for(var d=h.types[v],y=0;y<i.length;y++){var x=i[y],w=x.params[m];if(x!==t&&w&&g(w.types,d)&&!w.conversions[m]){h.types.splice(v,1),h.conversions.splice(v,1),v--;break}}v++}return i}function c(e){for(var t={},r=0;r<e.length;r++){var n=e[r];if(n.fn&&!n.hasConversions()){var i=n.params.join(\",\");t[i]=n.fn}}return t}function f(e,t){var r,n,i,o=t.length,u=[];for(r=0;r<e.length;r++)n=e[r],n.params.length!==o||i||(i=n),void 0!=n.params[o]&&u.push(n);u.sort(function(e,t){return a.compare(e.params[o],t.params[o])});var c=[];for(r=0;r<u.length;r++){n=u[r];var l=n.params[o],p=c.filter(function(e){return e.param.overlapping(l)})[0];if(p){if(p.param.varArgs)throw new Error('Conflicting types \"'+p.param+'\" and \"'+l+'\"');p.signatures.push(n)}else c.push({param:l,signatures:[n]})}var m=new Array(c.length);for(r=0;r<c.length;r++){var h=c[r];m[r]=f(h.signatures,t.concat(h.param))}return new s(t,i,m)}function l(e){for(var t=[],r=0;e>r;r++)t[r]=\"arg\"+r;return t}function p(e,t){var r=new i,a=u(t);if(0==a.length)throw new Error(\"No signatures provided\");var o=f(a,[]),s=[],p=e||\"\",h=l(m(a));s.push(\"function \"+p+\"(\"+h.join(\", \")+\") {\"),s.push('  \"use strict\";'),s.push(\"  var name = '\"+p+\"';\"),s.push(o.toCode(r,\"  \")),s.push(\"}\");var g=[r.toCode(),\"return \"+s.join(\"\\n\")].join(\"\\n\"),v=new Function(r.name,\"createError\",g),d=v(r,n);return d.signatures=c(a),d}function m(e){for(var t=0,r=0;r<e.length;r++){var n=e[r].params.length;n>t&&(t=n)}return t}function h(e){for(var t,r=0;r<N.types.length;r++){var n=N.types[r];if(\"Object\"===n.name)t=n;else if(n.test(e))return n.name}return t&&t.test(e)?t.name:\"unknown\"}function g(e,t){return-1!==e.indexOf(t)}function v(e,t){if(!e.signatures)throw new TypeError(\"Function is no typed-function\");var r;if(\"string\"==typeof t){r=t.split(\",\");for(var n=0;n<r.length;n++)r[n]=r[n].trim()}else{if(!Array.isArray(t))throw new TypeError(\"String array or a comma separated string expected\");r=t}var i=r.join(\",\"),a=e.signatures[i];if(a)return a;throw new TypeError(\"Signature not found (signature: \"+(e.name||\"unnamed\")+\"(\"+r.join(\", \")+\"))\")}function d(e,t){var r=h(e);if(t===r)return e;for(var n=0;n<N.conversions.length;n++){var i=N.conversions[n];if(i.from===r&&i.to===t)return i.convert(e)}throw new Error(\"Cannot convert from \"+r+\" to \"+t)}i.prototype.add=function(e,t){var r=t||\"fn\";this.categories[r]||(this.categories[r]=[]);var n=this.categories[r].indexOf(e);return-1==n&&(n=this.categories[r].length,this.categories[r].push(e)),r+n},i.prototype.toCode=function(){var e=[],t=this.name+\".categories\",r=this.categories;for(var n in r)if(r.hasOwnProperty(n))for(var i=r[n],a=0;a<i.length;a++)e.push(\"var \"+n+a+\" = \"+t+\"['\"+n+\"'][\"+a+\"];\");return e.join(\"\\n\")},a.compare=function(e,t){if(e.anyType)return 1;if(t.anyType)return-1;if(g(e.types,\"Object\"))return 1;if(g(t.types,\"Object\"))return-1;if(e.hasConversions()){if(t.hasConversions()){var r,n,i;for(r=0;r<e.conversions.length;r++)if(void 0!==e.conversions[r]){n=e.conversions[r];break}for(r=0;r<t.conversions.length;r++)if(void 0!==t.conversions[r]){i=t.conversions[r];break}return N.conversions.indexOf(n)-N.conversions.indexOf(i)}return 1}if(t.hasConversions())return-1;var a,o;for(r=0;r<N.types.length;r++)if(N.types[r].name===e.types[0]){a=r;break}for(r=0;r<N.types.length;r++)if(N.types[r].name===t.types[0]){o=r;break}return a-o},a.prototype.overlapping=function(e){for(var t=0;t<this.types.length;t++)if(g(e.types,this.types[t]))return!0;return!1},a.prototype.clone=function(){var e=new a(this.types.slice(),this.varArgs);return e.conversions=this.conversions.slice(),e},a.prototype.hasConversions=function(){return this.conversions.length>0},a.prototype.contains=function(e){for(var t=0;t<this.types.length;t++)if(e[this.types[t]])return!0;return!1},a.prototype.toString=function(e){for(var t=[],r={},n=0;n<this.types.length;n++){var i=this.conversions[n],a=e&&i?i.to:this.types[n];a in r||(r[a]=!0,t.push(a))}return(this.varArgs?\"...\":\"\")+t.join(\"|\")},o.prototype.clone=function(){return new o(this.params.slice(),this.fn)},o.prototype.expand=function(){function e(r,n){if(n.length<r.params.length){var i,s,u,c=r.params[n.length];if(c.varArgs){for(s=c.clone(),i=0;i<N.conversions.length;i++)if(u=N.conversions[i],!g(c.types,u.from)&&g(c.types,u.to)){var f=s.types.length;s.types[f]=u.from,s.conversions[f]=u}e(r,n.concat(s))}else{for(i=0;i<c.types.length;i++)e(r,n.concat(new a(c.types[i])));for(i=0;i<N.conversions.length;i++)u=N.conversions[i],!g(c.types,u.from)&&g(c.types,u.to)&&(s=new a(u.from),s.conversions[0]=u,e(r,n.concat(s)))}}else t.push(new o(n,r.fn))}var t=[];return e(this,[]),t},o.compare=function(e,t){if(e.params.length>t.params.length)return 1;if(e.params.length<t.params.length)return-1;var r,n=e.params.length,i=0,o=0;for(r=0;n>r;r++)e.params[r].hasConversions()&&i++,t.params[r].hasConversions()&&o++;if(i>o)return 1;if(o>i)return-1;for(r=0;r<e.params.length;r++){var s=a.compare(e.params[r],t.params[r]);if(0!==s)return s}return 0},o.prototype.hasConversions=function(){for(var e=0;e<this.params.length;e++)if(this.params[e].hasConversions())return!0;return!1},o.prototype.ignore=function(){for(var e={},t=0;t<N.ignore.length;t++)e[N.ignore[t]]=!0;for(t=0;t<this.params.length;t++)if(this.params[t].contains(e))return!0;return!1},o.prototype.toCode=function(e,t){for(var r=[],n=new Array(this.params.length),i=0;i<this.params.length;i++){var a=this.params[i],o=a.conversions[0];a.varArgs?n[i]=\"varArgs\":o?n[i]=e.add(o.convert,\"convert\")+\"(arg\"+i+\")\":n[i]=\"arg\"+i}var s=this.fn?e.add(this.fn,\"signature\"):void 0;return s?t+\"return \"+s+\"(\"+n.join(\", \")+\"); // signature: \"+this.params.join(\", \"):r.join(\"\\n\")},o.prototype.toString=function(){return this.params.join(\", \")},s.prototype.toCode=function(e,r,n){var i=[];if(this.param){var a=this.path.length-1,o=this.param.conversions[0],s=\"// type: \"+(o?o.from+\" (convert to \"+o.to+\")\":this.param);if(this.param.varArgs)if(this.param.anyType)i.push(r+\"if (arguments.length > \"+a+\") {\"),i.push(r+\"  var varArgs = [];\"),i.push(r+\"  for (var i = \"+a+\"; i < arguments.length; i++) {\"),i.push(r+\"    varArgs.push(arguments[i]);\"),i.push(r+\"  }\"),i.push(this.signature.toCode(e,r+\"  \")),i.push(r+\"}\");else{for(var u=function(r,n){for(var i=[],a=0;a<r.length;a++)i[a]=e.add(t(r[a]),\"test\")+\"(\"+n+\")\";return i.join(\" || \")}.bind(this),c=this.param.types,f=[],l=0;l<c.length;l++)void 0===this.param.conversions[l]&&f.push(c[l]);i.push(r+\"if (\"+u(c,\"arg\"+a)+\") { \"+s),i.push(r+\"  var varArgs = [arg\"+a+\"];\"),i.push(r+\"  for (var i = \"+(a+1)+\"; i < arguments.length; i++) {\"),i.push(r+\"    if (\"+u(f,\"arguments[i]\")+\") {\"),i.push(r+\"      varArgs.push(arguments[i]);\");for(var l=0;l<c.length;l++){var p=this.param.conversions[l];if(p){var m=e.add(t(c[l]),\"test\"),h=e.add(p.convert,\"convert\");i.push(r+\"    }\"),i.push(r+\"    else if (\"+m+\"(arguments[i])) {\"),i.push(r+\"      varArgs.push(\"+h+\"(arguments[i]));\")}}i.push(r+\"    } else {\"),i.push(r+\"      throw createError(name, arguments.length, i, arguments[i], '\"+f.join(\",\")+\"');\"),i.push(r+\"    }\"),i.push(r+\"  }\"),i.push(this.signature.toCode(e,r+\"  \")),i.push(r+\"}\")}else if(this.param.anyType)i.push(r+\"// type: any\"),i.push(this._innerCode(e,r,n));else{var g=this.param.types[0],m=\"any\"!==g?e.add(t(g),\"test\"):null;i.push(r+\"if (\"+m+\"(arg\"+a+\")) { \"+s),i.push(this._innerCode(e,r+\"  \",n)),i.push(r+\"}\")}}else i.push(this._innerCode(e,r,n));return i.join(\"\\n\")},s.prototype._innerCode=function(e,t,r){var n,i=[];this.signature&&(i.push(t+\"if (arguments.length === \"+this.path.length+\") {\"),i.push(this.signature.toCode(e,t+\"  \")),i.push(t+\"}\"));var a;for(n=0;n<this.childs.length;n++)if(this.childs[n].param.anyType){a=this.childs[n];break}for(n=0;n<this.childs.length;n++)i.push(this.childs[n].toCode(e,t,a));r&&!this.param.anyType&&i.push(r.toCode(e,t,a));var o=this._exceptions(e,t);return o&&i.push(o),i.join(\"\\n\")},s.prototype._exceptions=function(e,t){var r=this.path.length;if(0===this.childs.length)return[t+\"if (arguments.length > \"+r+\") {\",t+\"  throw createError(name, arguments.length, \"+r+\", arguments[\"+r+\"]);\",t+\"}\"].join(\"\\n\");for(var n={},i=[],a=0;a<this.childs.length;a++){var o=this.childs[a];if(o.param)for(var s=0;s<o.param.types.length;s++){var u=o.param.types[s];u in n||o.param.conversions[s]||(n[u]=!0,i.push(u))}}return t+\"throw createError(name, arguments.length, \"+r+\", arguments[\"+r+\"], '\"+i.join(\",\")+\"');\"};var y=[{name:\"number\",test:function(e){return\"number\"==typeof e}},{name:\"string\",test:function(e){return\"string\"==typeof e}},{name:\"boolean\",test:function(e){return\"boolean\"==typeof e}},{name:\"Function\",test:function(e){return\"function\"==typeof e}},{name:\"Array\",test:Array.isArray},{name:\"Date\",test:function(e){return e instanceof Date}},{name:\"RegExp\",test:function(e){return e instanceof RegExp}},{name:\"Object\",test:function(e){return\"object\"==typeof e}},{name:\"null\",test:function(e){return null===e}},{name:\"undefined\",test:function(e){return void 0===e}}],x={},w=[],b=[],N={config:x,types:y,conversions:w,ignore:b};return N=p(\"typed\",{Object:function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(e[n]);var i=r(t);return p(i,e)},\"string, Object\":p,\"...Function\":function(e){for(var t,n=r(e),i={},a=0;a<e.length;a++){var o=e[a];if(\"object\"!=typeof o.signatures)throw t=new TypeError(\"Function is no typed-function (index: \"+a+\")\"),t.data={index:a},t;for(var s in o.signatures)if(o.signatures.hasOwnProperty(s))if(i.hasOwnProperty(s)){if(o.signatures[s]!==i[s])throw t=new Error('Signature \"'+s+'\" is defined twice'),t.data={signature:s},t}else i[s]=o.signatures[s]}return p(n,i)}}),N.config=x,N.types=y,N.conversions=w,N.ignore=b,N.create=e,N.find=v,N.convert=d,N.addType=function(e){if(!e||\"string\"!=typeof e.name||\"function\"!=typeof e.test)throw new TypeError(\"Object with properties {name: string, test: function} expected\");N.types.push(e)},N.addConversion=function(e){if(!e||\"string\"!=typeof e.from||\"string\"!=typeof e.to||\"function\"!=typeof e.convert)throw new TypeError(\"Object with properties {from: string, to: string, convert: function} expected\");N.conversions.push(e)},N}return e()})},function(e,t,r){\"use strict\";var n=r(7);t.isNumber=function(e){return\"number\"==typeof e},t.isInteger=function(e){return isFinite(e)?e==Math.round(e):!1},t.sign=function(e){return e>0?1:0>e?-1:0},t.format=function(e,r){if(\"function\"==typeof r)return r(e);if(e===1/0)return\"Infinity\";if(e===-(1/0))return\"-Infinity\";if(isNaN(e))return\"NaN\";var n=\"auto\",i=void 0;switch(r&&(r.notation&&(n=r.notation),t.isNumber(r)?i=r:r.precision&&(i=r.precision)),n){case\"fixed\":return t.toFixed(e,i);case\"exponential\":return t.toExponential(e,i);case\"auto\":return t.toPrecision(e,i,r&&r.exponential).replace(/((\\.\\d*?)(0+))($|e)/,function(){var e=arguments[2],t=arguments[4];return\".\"!==e?e+t:t});default:throw new Error('Unknown notation \"'+n+'\". Choose \"auto\", \"exponential\", or \"fixed\".')}},t.toExponential=function(e,t){return new n(e).toExponential(t)},t.toFixed=function(e,t){return new n(e).toFixed(t)},t.toPrecision=function(e,t,r){return new n(e).toPrecision(t,r)},t.digits=function(e){return e.toExponential().replace(/e.*$/,\"\").replace(/^0\\.?0*|\\./,\"\").length},t.DBL_EPSILON=Number.EPSILON||2.220446049250313e-16,t.nearlyEqual=function(e,r,n){if(null==n)return e==r;if(e==r)return!0;if(isNaN(e)||isNaN(r))return!1;if(isFinite(e)&&isFinite(r)){var i=Math.abs(e-r);return i<t.DBL_EPSILON?!0:i<=Math.max(Math.abs(e),Math.abs(r))*n}return!1}},function(e,t){\"use strict\";function r(e){var t=String(e).toLowerCase().match(/^0*?(-?)(\\d+\\.?\\d*)(e([+-]?\\d+))?$/);if(!t)throw new SyntaxError(\"Invalid number\");var r=t[1],n=t[2],i=parseFloat(t[4]||\"0\"),a=n.indexOf(\".\");i+=-1!==a?a-1:n.length-1,this.sign=r,this.coefficients=n.replace(\".\",\"\").replace(/^0*/,function(e){return i-=e.length,\"\"}).replace(/0*$/,\"\").split(\"\").map(function(e){return parseInt(e)}),0===this.coefficients.length&&(this.coefficients.push(0),i++),this.exponent=i}function n(e){for(var t=[],r=0;e>r;r++)t.push(0);return t}r.prototype.toFixed=function(e){var t=this.roundDigits(this.exponent+1+(e||0)),r=t.coefficients,i=t.exponent+1,a=i+(e||0);return r.length<a&&(r=r.concat(n(a-r.length))),0>i&&(r=n(-i+1).concat(r),i=1),e&&r.splice(i,0,0===i?\"0.\":\".\"),this.sign+r.join(\"\")},r.prototype.toExponential=function(e){var t=e?this.roundDigits(e):this.clone(),r=t.coefficients,i=t.exponent;r.length<e&&(r=r.concat(n(e-r.length)));var a=r.shift();return this.sign+a+(r.length>0?\".\"+r.join(\"\"):\"\")+\"e\"+(i>=0?\"+\":\"\")+i},r.prototype.toPrecision=function(e,t){var r=t&&void 0!==t.lower?t.lower:.001,i=t&&void 0!==t.upper?t.upper:1e5,a=Math.abs(Math.pow(10,this.exponent));if(r>a||a>=i)return this.toExponential(e);var o=e?this.roundDigits(e):this.clone(),s=o.coefficients,u=o.exponent;s.length<e&&(s=s.concat(n(e-s.length))),s=s.concat(n(u-s.length+1+(s.length<e?e-s.length:0))),s=n(-u).concat(s);var c=u>0?u:0;return c<s.length-1&&s.splice(c+1,0,\".\"),this.sign+s.join(\"\")},r.prototype.clone=function(){var e=new r(\"0\");return e.sign=this.sign,e.coefficients=this.coefficients.slice(0),e.exponent=this.exponent,e},r.prototype.roundDigits=function(e){for(var t=this.clone(),r=t.coefficients;0>=e;)r.unshift(0),t.exponent++,e++;if(r.length>e){var n=r.splice(e);if(n[0]>=5){var i=e-1;for(r[i]++;10===r[i];)r.pop(),0===i&&(r.unshift(0),t.exponent++,i++),i--,r[i]++}}return t},e.exports=r},function(e,t,r){var n=r(9);t.mixin=function(e){var t=new n;return e.on=t.on.bind(t),e.off=t.off.bind(t),e.once=t.once.bind(t),e.emit=t.emit.bind(t),e}},function(e,t){function r(){}r.prototype={on:function(e,t,r){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:t,ctx:r}),this},once:function(e,t,r){var n=this,i=function(){n.off(e,i),t.apply(r,arguments)};return this.on(e,i,r)},emit:function(e){var t=[].slice.call(arguments,1),r=((this.e||(this.e={}))[e]||[]).slice(),n=0,i=r.length;for(n;i>n;n++)r[n].fn.apply(r[n].ctx,t);return this},off:function(e,t){var r=this.e||(this.e={}),n=r[e],i=[];if(n&&t)for(var a=0,o=n.length;o>a;a++)n[a].fn!==t&&i.push(n[a]);return i.length?r[e]=i:delete r[e],this}},e.exports=r},function(e,t,r){\"use strict\";function n(e,t,r,n,u){function c(e,t){var r=arguments.length;if(1!=r&&2!=r)throw new s(\"import\",r,1,2);if(t||(t={}),a(e))m(e,t);else if(Array.isArray(e))e.forEach(function(e){c(e,t)});else if(\"object\"==typeof e){for(var n in e)if(e.hasOwnProperty(n)){var i=e[n];h(i)?f(n,i,t):a(e)?m(e,t):c(i,t)}}else if(!t.silent)throw new TypeError(\"Factory, Object, or Array expected\")}function f(e,t,r){if(r.wrap&&\"function\"==typeof t&&(t=p(t)),g(u[e])&&g(t))return t=r.override?n(e,t.signatures):n(u[e],t),u[e]=t,l(e,t),void u.emit(\"import\",e,function(){return t});if(void 0===u[e]||r.override)return u[e]=t,l(e,t),void u.emit(\"import\",e,function(){return t});if(!r.silent)throw new Error('Cannot import \"'+e+'\": already exists')}function l(e,t){t&&\"function\"==typeof t.transform&&(u.expression.transform[e]=t.transform)}function p(e){var t=function(){for(var t=[],r=0,n=arguments.length;n>r;r++){var i=arguments[r];t[r]=i&&i.valueOf()}return e.apply(u,t)};return e.transform&&(t.transform=e.transform),t}function m(e,t){if(\"string\"==typeof e.name){var a=e.name,s=e.path?o(u,e.path):u,c=s.hasOwnProperty(a)?s[a]:void 0,f=function(){var i=r(e);if(g(c)&&g(i))return t.override||(i=n(c,i)),i;if(void 0===c||t.override)return i;if(!t.silent)throw new Error('Cannot import \"'+a+'\": already exists')};e.lazy!==!1?i(s,a,f):s[a]=f(),u.emit(\"import\",a,f,e.path)}else r(e)}function h(e){return\"function\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"boolean\"==typeof e||null===e||e&&e.isUnit===!0||e&&e.isComplex===!0}function g(e){return\"function\"==typeof e&&\"object\"==typeof e.signatures}return c}var i=r(3).lazy,a=r(3).isFactory,o=r(3).traverse,s=(r(3).extend,r(11));t.math=!0,t.name=\"import\",t.factory=n,t.lazy=!0},function(e,t){\"use strict\";function r(e,t,n,i){if(!(this instanceof r))throw new SyntaxError(\"Constructor must be called with the new operator\");this.fn=e,this.count=t,this.min=n,this.max=i,this.message=\"Wrong number of arguments in function \"+e+\" (\"+t+\" provided, \"+n+(void 0!=i?\"-\"+i:\"\")+\" expected)\",this.stack=(new Error).stack}r.prototype=new Error,r.prototype.constructor=Error,r.prototype.name=\"ArgumentsError\",r.prototype.isArgumentsError=!0,e.exports=r},function(e,t,r){\"use strict\";function n(e,t,r,n,a){return function(e){if(e){var r=i.clone(t);i.deepExtend(t,e);var n=i.clone(t);return a.emit(\"config\",n,r),n}return i.clone(t)}}var i=r(3);t.name=\"config\",t.math=!0,t.factory=n},function(e,t,r){e.exports=[r(14),r(76),r(80),r(312),r(495),r(497)]},function(e,t,r){e.exports=[r(15),r(20),r(21),r(26),r(31),r(37),r(69),r(70),r(72),r(73)]},function(e,t,r){e.exports=[r(16),r(18)]},function(e,t,r){function n(e,t,r,n,a){var o=i.constructor(t);return o.prototype.type=\"BigNumber\",o.prototype.isBigNumber=!0,o.prototype.toJSON=function(){return{mathjs:\"BigNumber\",value:this.toString()}},o.fromJSON=function(e){return new o(e.value)},a.on(\"config\",function(e,t){e.precision!==t.precision&&o.config({precision:e.precision})}),o}var i=r(17);r(6).digits;t.name=\"BigNumber\",t.path=\"type\",t.factory=n,t.math=!0},function(e,t,r){var n;!function(i){\"use strict\";function a(e){for(var t,r,n=1,i=e.length,a=e[0]+\"\";i>n;n++){for(t=e[n]+\"\",r=_-t.length;r--;)t=\"0\"+t;a+=t}for(i=a.length;48===a.charCodeAt(--i););return a.slice(0,i+1||1)}function o(e,t,r,n){var i,a,o,s,u;for(a=1,o=e[0];o>=10;o/=10,a++);return o=t-a,0>o?(o+=_,i=0):(i=Math.ceil((o+1)/_),o%=_),a=E(10,_-o),u=e[i]%a|0,null==n?3>o?(0==o?u=u/100|0:1==o&&(u=u/10|0),s=4>r&&99999==u||r>3&&49999==u||5e4==u||0==u):s=(4>r&&u+1==a||r>3&&u+1==a/2)&&(e[i+1]/a/100|0)==E(10,o-2)-1||(u==a/2||0==u)&&0==(e[i+1]/a/100|0):4>o?(0==o?u=u/1e3|0:1==o?u=u/100|0:2==o&&(u=u/10|0),s=(n||4>r)&&9999==u||!n&&r>3&&4999==u):s=((n||4>r)&&u+1==a||!n&&r>3&&u+1==a/2)&&(e[i+1]/a/1e3|0)==E(10,o-3)-1,s}function s(e,t,r){var n=e.constructor;return null==t||((y=0>t||t>8)||0!==t&&(n.errors?parseInt:parseFloat)(t)!=t)&&!p(n,\"rounding mode\",t,r,0)?n.rounding:0|t}function u(e,t,r,n){var i=e.constructor;return!(y=(n||0)>t||t>=S+1)&&(0===t||(i.errors?parseInt:parseFloat)(t)==t)||p(i,\"argument\",t,r,0)}function c(e,t){var r,n,i,s,u,c,f,l=0,p=0,m=0,h=e.constructor,v=h.ONE,d=h.rounding,y=h.precision;if(!e.c||!e.c[0]||e.e>17)return new h(e.c?e.c[0]?e.s<0?0:1/0:v:e.s?e.s<0?0:e:NaN);for(null==t?(w=!1,u=y):u=t,f=new h(.03125);e.e>-2;)e=e.times(f),m+=5;for(n=Math.log(E(2,m))/Math.LN10*2+5|0,u+=n,r=s=c=new h(v),h.precision=u;;){if(s=g(s.times(e),u,1),r=r.times(++p),f=c.plus(k(s,r,u,1)),a(f.c).slice(0,u)===a(c.c).slice(0,u)){for(i=m;i--;)c=g(c.times(c),u,1);if(null!=t)return h.precision=y,c;if(!(3>l&&o(c.c,u-n,d,l)))return g(c,h.precision=y,d,w=!0);h.precision=u+=10,r=s=f=new h(v),p=0,l++}c=f}}function f(e,t,r,n){var i,o,s=e.constructor,u=(e=new s(e)).e;if(null==t?r=0:(g(e,++t,r),r=n?t:t+e.e-u),u=e.e,i=a(e.c),1==n||2==n&&(u>=t||u<=s.toExpNeg)){for(;i.length<r;i+=\"0\");i.length>1&&(i=i.charAt(0)+\".\"+i.slice(1)),i+=(0>u?\"e\":\"e+\")+u}else{if(n=i.length,0>u){for(o=r-n;++u;i=\"0\"+i);i=\"0.\"+i}else if(++u>n){for(o=r-u,u-=n;u--;i+=\"0\");o>0&&(i+=\".\")}else o=r-n,n>u?i=i.slice(0,u)+\".\"+i.slice(u):o>0&&(i+=\".\");if(o>0)for(;o--;i+=\"0\");}return e.s<0&&e.c[0]?\"-\"+i:i}function l(e){var t=e.length-1,r=t*_+1;if(t=e[t]){for(;t%10==0;t/=10,r--);for(t=e[0];t>=10;t/=10,r++);}return r}function p(e,t,r,n,i){if(e.errors){var a=new Error((n||[\"new Decimal\",\"cmp\",\"div\",\"eq\",\"gt\",\"gte\",\"lt\",\"lte\",\"minus\",\"mod\",\"plus\",\"times\",\"toFraction\",\"pow\",\"random\",\"log\",\"sqrt\",\"toNearest\",\"divToInt\"][b?0>b?-b:b:0>1/b?1:0])+\"() \"+([\"number type has more than 15 significant digits\",\"LN10 out of digits\"][t]||t+([y?\" out of range\":\" not an integer\",\" not a boolean or binary digit\"][i]||\"\"))+\": \"+r);throw a.name=\"Decimal Error\",y=b=0,a}}function m(e,t,r){var n=new e(e.ONE);for(w=!1;1&r&&(n=n.times(t)),r>>=1,r;)t=t.times(t);return w=!0,n}function h(e,t){var r,n,i,s,u,c,f,l,m,v,d,y=1,x=10,b=e,N=b.c,E=b.constructor,M=E.ONE,A=E.rounding,_=E.precision;if(b.s<0||!N||!N[0]||!b.e&&1==N[0]&&1==N.length)return new E(N&&!N[0]?-1/0:1!=b.s?NaN:N?0:b);if(null==t?(w=!1,f=_):f=t,E.precision=f+=x,r=a(N),n=r.charAt(0),!(Math.abs(s=b.e)<15e14))return b=new E(n+\".\"+r.slice(1)),f+2>B.length&&p(E,1,f+2,\"ln\"),b=h(b,f-x).plus(new E(B.slice(0,f+2)).times(s+\"\")),E.precision=_,null==t?g(b,_,A,w=!0):b;for(;7>n&&1!=n||1==n&&r.charAt(1)>3;)b=b.times(e),r=a(b.c),n=r.charAt(0),y++;for(s=b.e,n>1?(b=new E(\"0.\"+r),s++):b=new E(n+\".\"+r.slice(1)),v=b,l=u=b=k(b.minus(M),b.plus(M),f,1),d=g(b.times(b),f,1),i=3;;){if(u=g(u.times(d),f,1),m=l.plus(k(u,new E(i),f,1)),a(m.c).slice(0,f)===a(l.c).slice(0,f)){if(l=l.times(2),0!==s&&(f+2>B.length&&p(E,1,f+2,\"ln\"),l=l.plus(new E(B.slice(0,f+2)).times(s+\"\"))),l=k(l,new E(y),f,1),null!=t)return E.precision=_,l;if(!o(l.c,f-x,A,c))return g(l,E.precision=_,A,w=!0);E.precision=f+=x,m=u=b=k(v.minus(M),v.plus(M),f,1),d=g(b.times(b),f,1),i=c=1}l=m,i+=2}}function g(e,t,r,n){var i,a,o,s,u,c,f,l,p=e.constructor;e:if(null!=t){if(!(f=e.c))return e;for(i=1,s=f[0];s>=10;s/=10,i++);if(a=t-i,0>a)a+=_,o=t,u=f[l=0],c=u/E(10,i-o-1)%10|0;else if(l=Math.ceil((a+1)/_),l>=f.length){if(!n)break e;for(;f.length<=l;f.push(0));u=c=0,i=1,a%=_,o=a-_+1}else{for(u=s=f[l],i=1;s>=10;s/=10,i++);a%=_,o=a-_+i,c=0>o?0:N(u/E(10,i-o-1)%10)}if(n=n||0>t||null!=f[l+1]||(0>o?u:u%E(10,i-o-1)),n=4>r?(c||n)&&(0==r||r==(e.s<0?3:2)):c>5||5==c&&(4==r||n||6==r&&(a>0?o>0?u/E(10,i-o):0:f[l-1])%10&1||r==(e.s<0?8:7)),1>t||!f[0])return f.length=0,n?(t-=e.e+1,f[0]=E(10,(_-t%_)%_),e.e=-t||0):f[0]=e.e=0,e;if(0==a?(f.length=l,s=1,l--):(f.length=l+1,s=E(10,_-a),f[l]=o>0?(u/E(10,i-o)%E(10,o)|0)*s:0),n)for(;;){if(0==l){for(a=1,o=f[0];o>=10;o/=10,a++);for(o=f[0]+=s,s=1;o>=10;o/=10,s++);a!=s&&(e.e++,f[0]==A&&(f[0]=1));break}if(f[l]+=s,f[l]!=A)break;f[l--]=0,s=1}for(a=f.length;0===f[--a];f.pop());}return w&&(e.e>p.maxE?e.c=e.e=null:e.e<p.minE&&(e.c=[e.e=0])),e}var v,d,y,x=i.crypto,w=!0,b=0,N=Math.floor,E=Math.pow,M=Object.prototype.toString,A=1e7,_=7,O=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_\",T={},C=9e15,S=1e9,z=3e3,B=\"2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058\";T.absoluteValue=T.abs=function(){var e=new this.constructor(this);return e.s<0&&(e.s=1),g(e)},T.ceil=function(){return g(new this.constructor(this),this.e+1,2)},T.comparedTo=T.cmp=function(e,t){var r,n=this,i=n.c,a=(b=-b,e=new n.constructor(e,t),\ne.c),o=n.s,s=e.s,u=n.e,c=e.e;if(!o||!s)return null;if(r=i&&!i[0],t=a&&!a[0],r||t)return r?t?0:-s:o;if(o!=s)return o;if(r=0>o,!i||!a)return u==c?0:!i^r?1:-1;if(u!=c)return u>c^r?1:-1;for(o=-1,s=(u=i.length)<(c=a.length)?u:c;++o<s;)if(i[o]!=a[o])return i[o]>a[o]^r?1:-1;return u==c?0:u>c^r?1:-1},T.decimalPlaces=T.dp=function(){var e,t,r=null;if(e=this.c){if(r=((t=e.length-1)-N(this.e/_))*_,t=e[t])for(;t%10==0;t/=10,r--);0>r&&(r=0)}return r},T.dividedBy=T.div=function(e,t){return b=2,k(this,new this.constructor(e,t))},T.dividedToIntegerBy=T.divToInt=function(e,t){var r=this,n=r.constructor;return b=18,g(k(r,new n(e,t),0,1,1),n.precision,n.rounding)},T.equals=T.eq=function(e,t){return b=3,0===this.cmp(e,t)},T.exponential=T.exp=function(){return c(this)},T.floor=function(){return g(new this.constructor(this),this.e+1,3)},T.greaterThan=T.gt=function(e,t){return b=4,this.cmp(e,t)>0},T.greaterThanOrEqualTo=T.gte=function(e,t){return b=5,t=this.cmp(e,t),1==t||0===t},T.isFinite=function(){return!!this.c},T.isInteger=T.isInt=function(){return!!this.c&&N(this.e/_)>this.c.length-2},T.isNaN=function(){return!this.s},T.isNegative=T.isNeg=function(){return this.s<0},T.isZero=function(){return!!this.c&&0==this.c[0]},T.lessThan=T.lt=function(e,t){return b=6,this.cmp(e,t)<0},T.lessThanOrEqualTo=T.lte=function(e,t){return b=7,t=this.cmp(e,t),-1==t||0===t},T.logarithm=T.log=function(e,t){var r,n,i,s,u,c,f,l,m,v=this,d=v.constructor,y=d.precision,x=d.rounding,N=5;if(null==e)e=new d(10),r=!0;else{if(b=15,e=new d(e,t),n=e.c,e.s<0||!n||!n[0]||!e.e&&1==n[0]&&1==n.length)return new d(NaN);r=e.eq(10)}if(n=v.c,v.s<0||!n||!n[0]||!v.e&&1==n[0]&&1==n.length)return new d(n&&!n[0]?-1/0:1!=v.s?NaN:n?0:1/0);if(u=r&&(s=n[0],n.length>1||1!=s&&10!=s&&100!=s&&1e3!=s&&1e4!=s&&1e5!=s&&1e6!=s),w=!1,f=y+N,l=f+10,c=h(v,f),r?(l>B.length&&p(d,1,l,\"log\"),i=new d(B.slice(0,l))):i=h(e,f),m=k(c,i,f,1),o(m.c,s=y,x))do if(f+=10,c=h(v,f),r?(l=f+10,l>B.length&&p(d,1,l,\"log\"),i=new d(B.slice(0,l))):i=h(e,f),m=k(c,i,f,1),!u){+a(m.c).slice(s+1,s+15)+1==1e14&&(m=g(m,y+1,0));break}while(o(m.c,s+=10,x));return w=!0,g(m,y,x)},T.minus=function(e,t){var r,n,i,a,o=this,s=o.constructor,u=o.s;if(b=8,e=new s(e,t),t=e.s,!u||!t)return new s(NaN);if(u!=t)return e.s=-t,o.plus(e);var c=o.c,f=e.c,l=N(e.e/_),p=N(o.e/_),m=s.precision,h=s.rounding;if(!p||!l){if(!c||!f)return c?(e.s=-t,e):new s(f?o:NaN);if(!c[0]||!f[0])return o=f[0]?(e.s=-t,e):new s(c[0]?o:3==h?-0:0),w?g(o,m,h):o}if(c=c.slice(),n=c.length,u=p-l){for((a=0>u)?(u=-u,r=c,n=f.length):(l=p,r=f),(p=Math.ceil(m/_))>n&&(n=p),u>(n+=2)&&(u=n,r.length=1),r.reverse(),t=u;t--;r.push(0));r.reverse()}else for((a=n<(i=f.length))&&(i=n),u=t=0;i>t;t++)if(c[t]!=f[t]){a=c[t]<f[t];break}if(a&&(r=c,c=f,f=r,e.s=-e.s),(t=-((i=c.length)-f.length))>0)for(;t--;c[i++]=0);for(p=A-1,t=f.length;t>u;){if(c[--t]<f[t]){for(n=t;n&&!c[--n];c[n]=p);--c[n],c[t]+=A}c[t]-=f[t]}for(;0==c[--i];c.pop());for(;0==c[0];c.shift(),--l);for(c[0]||(c=[l=0],e.s=3==h?-1:1),e.c=c,u=1,t=c[0];t>=10;t/=10,u++);return e.e=u+l*_-1,w?g(e,m,h):e},T.modulo=T.mod=function(e,t){var r,n,i=this,a=i.constructor,o=a.modulo;return b=9,e=new a(e,t),t=e.s,r=!i.c||!t||e.c&&!e.c[0],r||!e.c||i.c&&!i.c[0]?r?new a(NaN):g(new a(i),a.precision,a.rounding):(w=!1,9==o?(e.s=1,n=k(i,e,0,3,1),e.s=t,n.s*=t):n=k(i,e,0,o,1),n=n.times(e),w=!0,i.minus(n))},T.naturalLogarithm=T.ln=function(){return h(this)},T.negated=T.neg=function(){var e=new this.constructor(this);return e.s=-e.s||null,g(e)},T.plus=function(e,t){var r,n=this,i=n.constructor,a=n.s;if(b=10,e=new i(e,t),t=e.s,!a||!t)return new i(NaN);if(a!=t)return e.s=-t,n.minus(e);var o=n.c,s=e.c,u=N(e.e/_),c=N(n.e/_),f=i.precision,l=i.rounding;if(!c||!u){if(!o||!s)return new i(a/0);if(!o[0]||!s[0])return n=s[0]?e:new i(o[0]?n:0*a),w?g(n,f,l):n}if(o=o.slice(),a=c-u){for(0>a?(a=-a,r=o,t=s.length):(u=c,r=s,t=o.length),(c=Math.ceil(f/_))>t&&(t=c),a>++t&&(a=t,r.length=1),r.reverse();a--;r.push(0));r.reverse()}for(o.length-s.length<0&&(r=s,s=o,o=r),a=s.length,t=0,c=A;a;o[a]%=c)t=(o[--a]=o[a]+s[a]+t)/c|0;for(t&&(o.unshift(t),++u),a=o.length;0==o[--a];o.pop());for(e.c=o,a=1,t=o[0];t>=10;t/=10,a++);return e.e=a+u*_-1,w?g(e,f,l):e},T.precision=T.sd=function(e){var t=null,r=this;return e!=t&&e!==!!e&&1!==e&&0!==e&&p(r.constructor,\"argument\",e,\"precision\",1),r.c&&(t=l(r.c),e&&r.e+1>t&&(t=r.e+1)),t},T.round=function(){var e=this,t=e.constructor;return g(new t(e),e.e+1,t.rounding)},T.squareRoot=T.sqrt=function(){var e,t,r,n,i,o,s=this,u=s.c,c=s.s,f=s.e,l=s.constructor,p=new l(.5);if(1!==c||!u||!u[0])return new l(!c||0>c&&(!u||u[0])?NaN:u?s:1/0);for(w=!1,c=Math.sqrt(+s),0==c||c==1/0?(t=a(u),(t.length+f)%2==0&&(t+=\"0\"),c=Math.sqrt(t),f=N((f+1)/2)-(0>f||f%2),c==1/0?t=\"1e\"+f:(t=c.toExponential(),t=t.slice(0,t.indexOf(\"e\")+1)+f),n=new l(t)):n=new l(c.toString()),r=(f=l.precision)+3;;)if(o=n,n=p.times(o.plus(k(s,o,r+2,1))),a(o.c).slice(0,r)===(t=a(n.c)).slice(0,r)){if(t=t.slice(r-3,r+1),\"9999\"!=t&&(i||\"4999\"!=t)){(!+t||!+t.slice(1)&&\"5\"==t.charAt(0))&&(g(n,f+1,1),e=!n.times(n).eq(s));break}if(!i&&(g(o,f+1,0),o.times(o).eq(s))){n=o;break}r+=4,i=1}return w=!0,g(n,f,l.rounding,e)},T.times=function(e,t){var r,n,i=this,a=i.constructor,o=i.c,s=(b=11,e=new a(e,t),e.c),u=N(i.e/_),c=N(e.e/_),f=i.s;if(t=e.s,e.s=f==t?1:-1,!((u||o&&o[0])&&(c||s&&s[0])))return new a(!f||!t||o&&!o[0]&&!s||s&&!s[0]&&!o?NaN:o&&s?0*e.s:e.s/0);for(n=u+c,f=o.length,t=s.length,t>f&&(r=o,o=s,s=r,c=f,f=t,t=c),c=f+t,r=[];c--;r.push(0));for(u=t-1;u>-1;u--){for(t=0,c=f+u;c>u;)t=r[c]+s[u]*o[c-u-1]+t,r[c--]=t%A|0,t=t/A|0;r[c]=(r[c]+t)%A|0}for(t?++n:r[0]||r.shift(),c=r.length;!r[--c];r.pop());for(e.c=r,f=1,t=r[0];t>=10;t/=10,f++);return e.e=f+n*_-1,w?g(e,a.precision,a.rounding):e},T.toDecimalPlaces=T.toDP=function(e,t){var r=this;return r=new r.constructor(r),null!=e&&u(r,e,\"toDP\")?g(r,(0|e)+r.e+1,s(r,t,\"toDP\")):r},T.toExponential=function(e,t){var r=this;return r.c?f(r,null!=e&&u(r,e,\"toExponential\")?0|e:null,null!=e&&s(r,t,\"toExponential\"),1):r.toString()},T.toFixed=function(e,t){var r,n=this,i=n.constructor,a=i.toExpNeg,o=i.toExpPos;return null!=e&&(e=u(n,e,r=\"toFixed\")?n.e+(0|e):null,t=s(n,t,r)),i.toExpNeg=-(i.toExpPos=1/0),null!=e&&n.c?(r=f(n,e,t),n.s<0&&n.c&&(n.c[0]?r.indexOf(\"-\")<0&&(r=\"-\"+r):r=r.replace(\"-\",\"\"))):r=n.toString(),i.toExpNeg=a,i.toExpPos=o,r},T.toFormat=function(e,t){var r=this;if(!r.c)return r.toString();var n,i=r.s<0,a=r.constructor.format,o=a.groupSeparator,s=+a.groupSize,u=+a.secondaryGroupSize,c=r.toFixed(e,t).split(\".\"),f=c[0],l=c[1],p=i?f.slice(1):f,m=p.length;if(u&&(n=s,s=u,m-=u=n),s>0&&m>0){for(n=m%s||s,f=p.substr(0,n);m>n;n+=s)f+=o+p.substr(n,s);u>0&&(f+=o+p.slice(n)),i&&(f=\"-\"+f)}return l?f+a.decimalSeparator+((u=+a.fractionGroupSize)?l.replace(new RegExp(\"\\\\d{\"+u+\"}\\\\B\",\"g\"),\"$&\"+a.fractionGroupSeparator):l):f},T.toFraction=function(e){var t,r,n,i,o,s,u,c,f=this,m=f.constructor,h=t=new m(m.ONE),g=s=new m(0),v=f.c,d=new m(g);if(!v)return f.toString();for(n=d.e=l(v)-f.e-1,d.c[0]=E(10,(u=n%_)<0?_+u:u),(null==e||(!(b=12,o=new m(e)).s||(y=o.cmp(h)<0||!o.c)||m.errors&&N(o.e/_)<o.c.length-1)&&!p(m,\"max denominator\",e,\"toFraction\",0)||(e=o).cmp(d)>0)&&(e=n>0?d:h),w=!1,o=new m(a(v)),u=m.precision,m.precision=n=v.length*_*2;c=k(o,d,0,1,1),r=t.plus(c.times(g)),1!=r.cmp(e);)t=g,g=r,h=s.plus(c.times(r=h)),s=r,d=o.minus(c.times(r=d)),o=r;return r=k(e.minus(t),g,0,1,1),s=s.plus(r.times(h)),t=t.plus(r.times(g)),s.s=h.s=f.s,i=k(h,g,n,1).minus(f).abs().cmp(k(s,t,n,1).minus(f).abs())<1?[h+\"\",g+\"\"]:[s+\"\",t+\"\"],w=!0,m.precision=u,i},T.toNearest=function(e,t){var r=this,n=r.constructor;return r=new n(r),null==e?(e=new n(n.ONE),t=n.rounding):(b=17,e=new n(e),t=s(r,t,\"toNearest\")),e.c?r.c&&(e.c[0]?(w=!1,r=k(r,e,0,4>t?[4,5,7,8][t]:t,1).times(e),w=!0,g(r)):r.c=[r.e=0]):r.s&&(e.s&&(e.s=r.s),r=e),r},T.toNumber=function(){var e=this;return+e||(e.s?0*e.s:NaN)},T.toPower=T.pow=function(e,t){var r,n,i,s,u=this,f=u.constructor,l=u.s,p=(b=13,+(e=new f(e,t))),v=0>p?-p:p,d=f.precision,y=f.rounding;if(!u.c||!e.c||(i=!u.c[0])||!e.c[0])return new f(E(i?0*l:+u,p));if(u=new f(u),r=u.c.length,!u.e&&u.c[0]==u.s&&1==r)return u;if(t=e.c.length-1,e.e||e.c[0]!=e.s||t)if(n=N(e.e/_),i=n>=t,!i&&0>l)s=new f(NaN);else{if(i&&z>r*_*v){if(s=m(f,u,v),e.s<0)return f.ONE.div(s)}else{if(l=0>l&&1&e.c[Math.max(n,t)]?-1:1,t=E(+u,p),n=0!=t&&isFinite(t)?new f(t+\"\").e:N(p*(Math.log(\"0.\"+a(u.c))/Math.LN10+u.e+1)),n>f.maxE+1||n<f.minE-1)return new f(n>0?l/0:0);w=!1,f.rounding=u.s=1,v=Math.min(12,(n+\"\").length),s=c(e.times(h(u,d+v)),d),s=g(s,d+5,1),o(s.c,d,y)&&(n=d+10,s=g(c(e.times(h(u,n+v)),n),n+5,1),+a(s.c).slice(d+1,d+15)+1==1e14&&(s=g(s,d+1,0))),s.s=l,w=!0,f.rounding=y}s=g(s,d,y)}else s=g(u,d,y);return s},T.toPrecision=function(e,t){var r=this;return null!=e&&u(r,e,\"toPrecision\",1)&&r.c?f(r,0|--e,s(r,t,\"toPrecision\"),2):r.toString()},T.toSignificantDigits=T.toSD=function(e,t){var r=this,n=r.constructor;return r=new n(r),null!=e&&u(r,e,\"toSD\",1)?g(r,0|e,s(r,t,\"toSD\")):g(r,n.precision,n.rounding)},T.toString=function(e){var t,r,n,i=this,o=i.constructor,s=i.e;if(null===s)r=i.s?\"Infinity\":\"NaN\";else{if(e===t&&(s<=o.toExpNeg||s>=o.toExpPos))return f(i,null,o.rounding,1);if(r=a(i.c),0>s){for(;++s;r=\"0\"+r);r=\"0.\"+r}else if(n=r.length,s>0)if(++s>n)for(s-=n;s--;r+=\"0\");else n>s&&(r=r.slice(0,s)+\".\"+r.slice(s));else if(t=r.charAt(0),n>1)r=t+\".\"+r.slice(1);else if(\"0\"==t)return t;if(null!=e)if((y=!(e>=2&&65>e))||e!=(0|e)&&o.errors)p(o,\"base\",e,\"toString\",0);else if(r=v(o,r,0|e,10,i.s),\"0\"==r)return r}return i.s<0?\"-\"+r:r},T.truncated=T.trunc=function(){return g(new this.constructor(this),this.e+1,1)},T.valueOf=T.toJSON=function(){return this.toString()},v=function(){function e(e,t,r){for(var n,i,a=[0],o=0,s=e.length;s>o;){for(i=a.length;i--;a[i]*=t);for(a[n=0]+=O.indexOf(e.charAt(o++));n<a.length;n++)a[n]>r-1&&(null==a[n+1]&&(a[n+1]=0),a[n+1]+=a[n]/r|0,a[n]%=r)}return a.reverse()}return function(t,r,n,i,a){var o,s,u,c,f,l,p=r.indexOf(\".\"),h=t.precision,g=t.rounding;for(37>i&&(r=r.toLowerCase()),p>=0&&(r=r.replace(\".\",\"\"),l=new t(i),c=m(t,l,r.length-p),l.c=e(c.toFixed(),10,n),l.e=l.c.length),f=e(r,i,n),o=s=f.length;0==f[--s];f.pop());if(!f[0])return\"0\";if(0>p?o--:(c.c=f,c.e=o,c.s=a,c=k(c,l,h,g,0,n),f=c.c,u=c.r,o=c.e),p=f[h],s=n/2,u=u||null!=f[h+1],4>g?(null!=p||u)&&(0==g||g==(0>a?3:2)):p>s||p==s&&(4==g||u||6==g&&1&f[h-1]||g==(0>a?8:7)))for(f.length=h,--n;++f[--h]>n;)f[h]=0,h||(++o,f.unshift(1));else f.length=h;for(s=f.length;!f[--s];);for(p=0,r=\"\";s>=p;r+=O.charAt(f[p++]));if(0>o){for(;++o;r=\"0\"+r);r=\"0.\"+r}else if(p=r.length,++o>p)for(o-=p;o--;r+=\"0\");else p>o&&(r=r.slice(0,o)+\".\"+r.slice(o));return r}}();var k=function(){function e(e,t,r){var n,i=0,a=e.length;for(e=e.slice();a--;)n=e[a]*t+i,e[a]=n%r|0,i=n/r|0;return i&&e.unshift(i),e}function t(e,t,r,n){var i,a;if(r!=n)a=r>n?1:-1;else for(i=a=0;r>i;i++)if(e[i]!=t[i]){a=e[i]>t[i]?1:-1;break}return a}function r(e,t,r,n){for(var i=0;r--;)e[r]-=i,i=e[r]<t[r]?1:0,e[r]=i*n+e[r]-t[r];for(;!e[0]&&e.length>1;e.shift());}return function(n,i,a,o,s,u){var c,f,l,p,m,h,v,d,y,x,w,b,E,M,O,T,C,S,z,B=n.constructor,k=n.s==i.s?1:-1,I=n.c,R=i.c;if(!(I&&I[0]&&R&&R[0]))return new B(n.s&&i.s&&(I?!R||I[0]!=R[0]:R)?I&&0==I[0]||!R?0*k:k/0:NaN);for(u?(p=1,f=n.e-i.e):(u=A,p=_,f=N(n.e/p)-N(i.e/p)),S=R.length,T=I.length,y=new B(k),x=y.c=[],l=0;R[l]==(I[l]||0);l++);if(R[l]>(I[l]||0)&&f--,null==a?(k=a=B.precision,o=B.rounding):k=s?a+(n.e-i.e)+1:a,0>k)x.push(1),m=!0;else{if(k=k/p+2|0,l=0,1==S){for(h=0,R=R[0],k++;(T>l||h)&&k--;l++)M=h*u+(I[l]||0),x[l]=M/R|0,h=M%R|0;m=h||T>l}else{for(h=u/(R[0]+1)|0,h>1&&(R=e(R,h,u),I=e(I,h,u),S=R.length,T=I.length),O=S,w=I.slice(0,S),b=w.length;S>b;w[b++]=0);z=R.slice(),z.unshift(0),C=R[0],R[1]>=u/2&&C++;do h=0,c=t(R,w,S,b),0>c?(E=w[0],S!=b&&(E=E*u+(w[1]||0)),h=E/C|0,h>1?(h>=u&&(h=u-1),v=e(R,h,u),d=v.length,b=w.length,c=t(v,w,d,b),1==c&&(h--,r(v,d>S?z:R,d,u))):(0==h&&(c=h=1),v=R.slice()),d=v.length,b>d&&v.unshift(0),r(w,v,b,u),-1==c&&(b=w.length,c=t(R,w,S,b),1>c&&(h++,r(w,b>S?z:R,b,u))),b=w.length):0===c&&(h++,w=[0]),x[l++]=h,c&&w[0]?w[b++]=I[O]||0:(w=[I[O]],b=1);while((O++<T||null!=w[0])&&k--);m=null!=w[0]}x[0]||x.shift()}if(1==p)y.e=f,y.r=+m;else{for(l=1,k=x[0];k>=10;k/=10,l++);y.e=l+f*p-1,g(y,s?a+y.e+1:a,o,m)}return y}}();d=function(){function e(e){var t,r,n,i=this,a=\"config\",o=i.errors?parseInt:parseFloat;return e==r||\"object\"!=typeof e&&!p(i,\"object expected\",e,a)?i:((n=e[t=\"precision\"])!=r&&((y=1>n||n>S)||o(n)!=n?p(i,t,n,a,0):i[t]=0|n),(n=e[t=\"rounding\"])!=r&&((y=0>n||n>8)||o(n)!=n?p(i,t,n,a,0):i[t]=0|n),(n=e[t=\"toExpNeg\"])!=r&&((y=-C>n||n>0)||o(n)!=n?p(i,t,n,a,0):i[t]=N(n)),(n=e[t=\"toExpPos\"])!=r&&((y=0>n||n>C)||o(n)!=n?p(i,t,n,a,0):i[t]=N(n)),(n=e[t=\"minE\"])!=r&&((y=-C>n||n>0)||o(n)!=n?p(i,t,n,a,0):i[t]=N(n)),(n=e[t=\"maxE\"])!=r&&((y=0>n||n>C)||o(n)!=n?p(i,t,n,a,0):i[t]=N(n)),(n=e[t=\"errors\"])!=r&&(n===!!n||1===n||0===n?(y=b=0,i[t]=!!n):p(i,t,n,a,1)),(n=e[t=\"crypto\"])!=r&&(n===!!n||1===n||0===n?i[t]=!(!n||!x||\"object\"!=typeof x):p(i,t,n,a,1)),(n=e[t=\"modulo\"])!=r&&((y=0>n||n>9)||o(n)!=n?p(i,t,n,a,0):i[t]=0|n),(e=e[t=\"format\"])!=r&&(\"object\"==typeof e?i[t]=e:p(i,\"format object expected\",e,a)),i)}function t(e){return new this(e).exp()}function r(e){return new this(e).ln()}function n(e,t){return new this(e).log(t)}function i(e,t,r){var n,i,a=0;for(\"[object Array]\"==M.call(t[0])&&(t=t[0]),n=new e(t[0]);++a<t.length;){if(i=new e(t[a]),!i.s){n=i;break}n[r](i)&&(n=i)}return n}function a(){return i(this,arguments,\"lt\")}function o(){return i(this,arguments,\"gt\")}function s(e,t){return new this(e).pow(t)}function c(e){var t,r,n,i=0,a=[],o=this,s=new o(o.ONE);if(null!=e&&u(s,e,\"random\")?e|=0:e=o.precision,r=Math.ceil(e/_),o.crypto)if(x&&x.getRandomValues)for(t=x.getRandomValues(new Uint32Array(r));r>i;)n=t[i],n>=429e7?t[i]=x.getRandomValues(new Uint32Array(1))[0]:a[i++]=n%1e7;else if(x&&x.randomBytes){for(t=x.randomBytes(r*=4);r>i;)n=t[i]+(t[i+1]<<8)+(t[i+2]<<16)+((127&t[i+3])<<24),n>=214e7?x.randomBytes(4).copy(t,i):(a.push(n%1e7),i+=4);i=r/4}else p(o,\"crypto unavailable\",x,\"random\");if(!i)for(;r>i;)a[i++]=1e7*Math.random()|0;for(r=a[--i],e%=_,r&&e&&(n=E(10,_-e),a[i]=(r/n|0)*n);0===a[i];i--)a.pop();if(0>i)a=[r=0];else{for(r=-1;0===a[0];)a.shift(),r-=_;for(i=1,n=a[0];n>=10;)n/=10,i++;_>i&&(r-=_-i)}return s.e=r,s.c=a,s}function f(e){return new this(e).sqrt()}function l(i){function u(e,t){var r=this;if(!(r instanceof u))return p(u,\"Decimal called without new\",e),new u(e,t);if(r.constructor=u,e instanceof u){if(null==t)return b=0,r.s=e.s,r.e=e.e,r.c=(e=e.c)?e.slice():e,r;if(10==t)return g(new u(e),u.precision,u.rounding);e+=\"\"}return m(u,r,e,t)}return u.precision=20,u.rounding=4,u.modulo=1,u.toExpNeg=-7,u.toExpPos=21,u.minE=-C,u.maxE=C,u.errors=!0,u.crypto=!1,u.format={decimalSeparator:\".\",groupSeparator:\",\",groupSize:3,secondaryGroupSize:0,fractionGroupSeparator:\" \",fractionGroupSize:0},u.prototype=T,u.ONE=new u(1),u.ROUND_UP=0,u.ROUND_DOWN=1,u.ROUND_CEIL=2,u.ROUND_FLOOR=3,u.ROUND_HALF_UP=4,u.ROUND_HALF_DOWN=5,u.ROUND_HALF_EVEN=6,u.ROUND_HALF_CEIL=7,u.ROUND_HALF_FLOOR=8,u.EUCLID=9,u.config=e,u.constructor=l,u.exp=t,u.ln=r,u.log=n,u.max=a,u.min=o,u.pow=s,u.sqrt=f,u.random=c,null!=i&&u.config(i),u}var m=function(){var e=/^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,t=String.prototype.trim||function(){return this.replace(/^\\s+|\\s+$/g,\"\")};return function(r,n,i,a){var o,s,u,c,f,l;if(\"string\"!=typeof i&&(i=(c=\"number\"==typeof i||\"[object Number]\"==M.call(i))&&0===i&&0>1/i?\"-0\":i+\"\"),f=i,null==a&&e.test(i))n.s=45===i.charCodeAt(0)?(i=i.slice(1),-1):1;else{if(10==a)return g(new r(i),r.precision,r.rounding);if(i=t.call(i).replace(/^\\+(?!-)/,\"\"),n.s=45===i.charCodeAt(0)?(i=i.replace(/^-(?!-)/,\"\"),-1):1,null!=a?a!=(0|a)&&r.errors||(y=!(a>=2&&65>a))?(p(r,\"base\",a,0,0),l=e.test(i)):(o=\"[\"+O.slice(0,a=0|a)+\"]+\",i=i.replace(/\\.$/,\"\").replace(/^\\./,\"0.\"),(l=new RegExp(\"^\"+o+\"(?:\\\\.\"+o+\")?$\",37>a?\"i\":\"\").test(i))?(c&&(i.replace(/^0\\.0*|\\./,\"\").length>15&&p(r,0,f),c=!c),i=v(r,i,10,a,n.s)):\"Infinity\"!=i&&\"NaN\"!=i&&(p(r,\"not a base \"+a+\" number\",f),i=\"NaN\")):l=e.test(i),!l)return n.c=n.e=null,\"Infinity\"!=i&&(\"NaN\"!=i&&p(r,\"not a number\",f),n.s=null),b=0,n}for((s=i.indexOf(\".\"))>-1&&(i=i.replace(\".\",\"\")),(u=i.search(/e/i))>0?(0>s&&(s=u),s+=+i.slice(u+1),i=i.substring(0,u)):0>s&&(s=i.length),u=0;48===i.charCodeAt(u);u++);for(a=i.length;48===i.charCodeAt(--a););if(i=i.slice(u,a+1)){if(a=i.length,c&&a>15&&p(r,0,f),n.e=s=s-u-1,n.c=[],u=(s+1)%_,0>s&&(u+=_),a>u){for(u&&n.c.push(+i.slice(0,u)),a-=_;a>u;)n.c.push(+i.slice(u,u+=_));i=i.slice(u),u=_-i.length}else u-=a;for(;u--;i+=\"0\");n.c.push(+i),w&&(n.e>r.maxE?n.c=n.e=null:n.e<r.minE&&(n.c=[n.e=0]))}else n.c=[n.e=0];return b=0,n}}();return l()}(),n=function(){return d}.call(t,r,t,e),!(void 0!==n&&(e.exports=n))}(this)},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"bignumber\",{\"\":function(){return new e.BigNumber(0)},number:function(t){return new e.BigNumber(t+\"\")},string:function(t){return new e.BigNumber(t)},BigNumber:function(e){return e},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex={0:\"0\",1:\"\\\\left(${args[0]}\\\\right)\"},a}var i=r(19);t.name=\"bignumber\",t.factory=n},function(e,t){\"use strict\";e.exports=function r(e,t,n){return e&&\"function\"==typeof e.map?e.map(function(e){return r(e,t,n)}):t(e)}},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"bool\",{\"\":function(){return!1},\"boolean\":function(e){return e},number:function(e){return!!e},BigNumber:function(e){return!e.isZero()},string:function(e){var t=e.toLowerCase();if(\"true\"===t)return!0;if(\"false\"===t)return!1;var r=Number(e);if(\"\"!=e&&!isNaN(r))return!!r;throw new Error('Cannot convert \"'+e+'\" to a boolean')},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);t.name=\"boolean\",t.factory=n},function(e,t,r){e.exports=[r(22),r(25)]},function(e,t,r){\"use strict\";function n(e,t,r,n,o){function s(e){if(!(this instanceof s))throw new SyntaxError(\"Constructor must be called with the new operator\");e&&e.isChain?this.value=e.value:this.value=e}function u(e,t){\"function\"==typeof t&&(s.prototype[e]=f(t))}function c(e,t){a(s.prototype,e,function(){var e=t();return\"function\"==typeof e?f(e):void 0})}function f(e){return function(){for(var t=[this.value],r=0;r<arguments.length;r++)t[r+1]=arguments[r];return new s(e.apply(e,t))}}return s.prototype.type=\"Chain\",s.prototype.isChain=!0,s.prototype.done=function(){return this.value},s.prototype.valueOf=function(){return this.value},s.prototype.toString=function(){return i(this.value)},s.createProxy=function(e,t){if(\"string\"==typeof e)u(e,t);else for(var r in e)e.hasOwnProperty(r)&&u(r,e[r])},s.createProxy(o),o.on(\"import\",function(e,t,r){void 0===r&&c(e,t)}),s}var i=r(23).format,a=r(3).lazy;t.name=\"Chain\",t.path=\"type\",t.factory=n,t.math=!0,t.lazy=!1},function(e,t,r){\"use strict\";function n(e,r){if(Array.isArray(e)){for(var i=\"[\",a=e.length,o=0;a>o;o++)0!=o&&(i+=\", \"),i+=n(e[o],r);return i+=\"]\"}return t.format(e,r)}var i=r(6).format,a=r(24).format;t.isString=function(e){return\"string\"==typeof e},t.endsWith=function(e,t){var r=e.length-t.length,n=e.length;return e.substring(r,n)===t},t.format=function(e,r){return\"number\"==typeof e?i(e,r):e&&e.isBigNumber===!0?a(e,r):e&&e.isFraction===!0?r&&\"decimal\"===r.fraction?e.toString():e.s*e.n+\"/\"+e.d:Array.isArray(e)?n(e,r):t.isString(e)?'\"'+e+'\"':\"function\"==typeof e?e.syntax?e.syntax+\"\":\"function\":\"object\"==typeof e?\"function\"==typeof e.format?e.format(r):e.toString():String(e)}},function(e,t){t.format=function(e,r){if(\"function\"==typeof r)return r(e);if(!e.isFinite())return e.isNaN()?\"NaN\":e.gt(0)?\"Infinity\":\"-Infinity\";var n=\"auto\",i=void 0;switch(void 0!==r&&(r.notation&&(n=r.notation),\"number\"==typeof r?i=r:r.precision&&(i=r.precision)),n){case\"fixed\":return t.toFixed(e,i);case\"exponential\":return t.toExponential(e,i);case\"auto\":var a=.001,o=1e5;r&&r.exponential&&(void 0!==r.exponential.lower&&(a=r.exponential.lower),void 0!==r.exponential.upper&&(o=r.exponential.upper));({toExpNeg:e.constructor.toExpNeg,toExpPos:e.constructor.toExpPos});if(e.constructor.config({toExpNeg:Math.round(Math.log(a)/Math.LN10),toExpPos:Math.round(Math.log(o)/Math.LN10)}),e.isZero())return\"0\";var s,u=e.abs();return s=u.gte(a)&&u.lt(o)?e.toSignificantDigits(i).toFixed():t.toExponential(e,i),s.replace(/((\\.\\d*?)(0+))($|e)/,function(){var e=arguments[2],t=arguments[4];return\".\"!==e?e+t:t});default:throw new Error('Unknown notation \"'+n+'\". Choose \"auto\", \"exponential\", or \"fixed\".')}},t.toExponential=function(e,t){return void 0!==t?e.toExponential(t-1):e.toExponential()},t.toFixed=function(e,t){return e.toFixed(t||0)}},function(e,t){\"use strict\";function r(e,t,r,n){return n(\"chain\",{\"\":function(){return new e.Chain},any:function(t){return new e.Chain(t)}})}t.name=\"chain\",t.factory=r},function(e,t,r){e.exports=[r(27),r(29)]},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e,t){if(!(this instanceof s))throw new SyntaxError(\"Constructor must be called with the new operator\");switch(arguments.length){case 0:this.re=0,this.im=0;break;case 1:var r=arguments[0];if(\"object\"==typeof r){if(\"re\"in r&&\"im\"in r){var n=new s(r.re,r.im);this.re=n.re,this.im=n.im;break}if(\"r\"in r&&\"phi\"in r){var n=s.fromPolar(r.r,r.phi);this.re=n.re,this.im=n.im;break}}throw new SyntaxError(\"Object with the re and im or r and phi properties expected.\");case 2:if(!i(e)||!i(t))throw new TypeError(\"Two numbers expected in Complex constructor\");this.re=e,this.im=t;break;default:throw new SyntaxError(\"One, two or three arguments expected in Complex constructor\")}}function u(){for(;\" \"==x||\"\t\"==x;)l()}function c(e){return e>=\"0\"&&\"9\">=e||\".\"==e}function f(e){return e>=\"0\"&&\"9\">=e}function l(){y++,x=d.charAt(y)}function p(e){y=e,x=d.charAt(y)}function m(){var e,t=\"\";if(e=y,\"+\"==x?l():\"-\"==x&&(t+=x,l()),!c(x))return p(e),null;if(\".\"==x){if(t+=x,l(),!f(x))return p(e),null}else{for(;f(x);)t+=x,l();\".\"==x&&(t+=x,l())}for(;f(x);)t+=x,l();if(\"E\"==x||\"e\"==x){if(t+=x,l(),(\"+\"==x||\"-\"==x)&&(t+=x,l()),!f(x))return p(e),null;for(;f(x);)t+=x,l()}return t}function h(){var e=d.charAt(y+1);if(\"I\"==x||\"i\"==x)return l(),\"1\";if(!(\"+\"!=x&&\"-\"!=x||\"I\"!=e&&\"i\"!=e)){var t=\"+\"==x?\"1\":\"-1\";return l(),l(),t}return null}function g(){return new SyntaxError('End of string expected, got \"'+d.substr(y)+'\"')}var v=n(r(28));s.prototype.isComplex=!0,s.prototype.type=\"Complex\";var d,y,x;return s.parse=function(e){if(d=e,y=-1,x=\"\",\"string\"!=typeof d)throw new TypeError(\"Invalid argument in Complex.parse, string expected\");l(),u();var t=m();if(t){if(\"I\"==x||\"i\"==x){if(l(),u(),x)throw g();return new s(0,Number(t))}u();var r=x;if(\"+\"!=r&&\"-\"!=r){if(u(),x)throw g();return new s(Number(t),0)}l(),u();var n=m();if(n){if(\"I\"!=x&&\"i\"!=x)throw new SyntaxError('Character \"i\" expected, got \"'+x+'\"');l()}else if(n=h(),!n)throw new SyntaxError(\"Imaginary part expected\");if(\"-\"==r&&(n=\"-\"==n[0]?\"+\"+n.substring(1):\"-\"+n),l(),u(),x)throw g();return new s(Number(t),Number(n))}if(t=h()){if(u(),x)throw g();return new s(0,Number(t))}throw new SyntaxError('Could not parse: \"'+e+'\" as complex number')},s.fromPolar=function(e){switch(arguments.length){case 1:var t=arguments[0];if(\"object\"==typeof t)return s.fromPolar(t.r,t.phi);throw new TypeError(\"Input has to be an object with r and phi keys.\");case 2:var r=arguments[0],n=arguments[1];if(i(r)){if(n&&n.isUnit&&n.hasBase(v.BASE_UNITS.ANGLE)&&(n=n.toNumber(\"rad\")),i(n))return new s(r*Math.cos(n),r*Math.sin(n));throw new TypeError(\"Phi is not a number nor an angle unit.\")}throw new TypeError(\"Radius r is not a number.\");default:throw new SyntaxError(\"Wrong number of arguments in function fromPolar\")}},s.prototype.toPolar=function(){return{r:Math.sqrt(this.re*this.re+this.im*this.im),phi:Math.atan2(this.im,this.re)}},s.prototype.clone=function(){return new s(this.re,this.im)},s.prototype.equals=function(e){return this.re===e.re&&this.im===e.im},s.prototype.format=function(e){var t=\"\",r=this.im,n=this.re,o=a(this.re,e),s=a(this.im,e),u=i(e)?e:e?e.precision:null;if(null!==u){var c=Math.pow(10,-u);Math.abs(n/r)<c&&(n=0),Math.abs(r/n)<c&&(r=0)}return t=0==r?o:0==n?1==r?\"i\":-1==r?\"-i\":s+\"i\":r>0?1==r?o+\" + i\":o+\" + \"+s+\"i\":-1==r?o+\" - i\":o+\" - \"+s.substring(1)+\"i\"},s.prototype.toString=function(){return this.format()},s.prototype.toJSON=function(){return{mathjs:\"Complex\",re:this.re,im:this.im}},s.fromJSON=function(e){return new s(e)},s.prototype.valueOf=s.prototype.toString,s}var i=r(6).isNumber,a=r(6).format;t.name=\"Complex\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){function o(e,t){if(!(this instanceof o))throw new Error(\"Constructor must be called with the new operator\");if(void 0!=e&&\"number\"!=typeof e)throw new TypeError(\"First parameter in Unit constructor must be a number\");if(void 0!=t&&(\"string\"!=typeof t||\"\"==t))throw new TypeError(\"Second parameter in Unit constructor must be a string\");if(void 0!=t){var r=o.parse(t);this.units=r.units,this.dimensions=r.dimensions}else this.units=[{unit:A,prefix:b,power:0}],this.dimensions=[0,0,0,0,0,0,0,0,0];this.value=void 0!=e?this._normalize(e):null,this.fixPrefix=!1,this.isUnitListSimplified=!0}function s(){for(;\" \"==y||\"\t\"==y;)f()}function u(e){return e>=\"0\"&&\"9\">=e||\".\"==e}function c(e){return e>=\"0\"&&\"9\">=e}function f(){d++,y=v.charAt(d)}function l(e){d=e,y=v.charAt(d)}function p(){var e,t=\"\";if(e=d,\"+\"==y?f():\"-\"==y&&(t+=y,f()),!u(y))return l(e),null;if(\".\"==y){if(t+=y,f(),!c(y))return l(e),null}else{for(;c(y);)t+=y,f();\".\"==y&&(t+=y,f())}for(;c(y);)t+=y,f();if(\"E\"==y||\"e\"==y){var r=\"\",n=d;if(r+=y,f(),(\"+\"==y||\"-\"==y)&&(r+=y,f()),!c(y))return l(n),t;for(t+=r;c(y);)t+=y,f()}return t}function m(){for(var e=\"\",t=v.charCodeAt(d);t>=48&&57>=t||t>=65&&90>=t||t>=97&&122>=t;)e+=y,f(),t=v.charCodeAt(d);return t=e.charCodeAt(0),t>=65&&90>=t||t>=97&&122>=t?e||null:null}function h(e){return y===e?(f(),e):null}function g(e){for(var t in _)if(_.hasOwnProperty(t)&&a(e,t)){var r=_[t],n=e.length-t.length,i=e.substring(0,n),o=r.prefixes[i];if(void 0!==o)return{unit:r,prefix:o}}return null}o.prototype.type=\"Unit\",o.prototype.isUnit=!0;var v,d,y;o.parse=function(e){if(v=e,d=-1,y=\"\",\"string\"!=typeof v)throw new TypeError(\"Invalid argument in Unit.parse, string expected\");var t=new o;t.units=[],f(),s();var r=p(),n=null;r&&(n=parseFloat(r)),s();for(var i=1,a=!1,u=[],c=1;;){for(s();\"(\"===y;)u.push(i),c*=i,i=1,f(),s();if(!y)break;var l=y,x=m();if(null==x)throw new SyntaxError('Unexpected \"'+l+'\" in \"'+v+'\" at index '+d.toString());var w=g(x);if(null==w)throw new SyntaxError('Unit \"'+x+'\" not found.');var b=i*c;if(s(),h(\"^\")){s();var E=p();if(null==E)throw new SyntaxError('In \"'+e+'\", \"^\" must be followed by a floating-point number');b*=E}t.units.push({unit:w.unit,prefix:w.prefix,power:b});for(var M=0;M<N.length;M++)t.dimensions[M]+=w.unit.dimensions[M]*b;for(s();\")\"===y;){if(0===u.length)throw new SyntaxError('Unmatched \")\" in \"'+v+'\" at index '+d.toString());c/=u.pop(),f(),s()}a=!1,h(\"*\")?(i=1,a=!0):h(\"/\")?(i=-1,a=!0):i=1;var A=w.unit.base.key;T.auto[A]={unit:w.unit,prefix:w.prefix}}if(s(),y)throw new SyntaxError('Could not parse: \"'+e+'\"');if(a)throw new SyntaxError('Trailing characters: \"'+e+'\"');if(0!==u.length)throw new SyntaxError('Unmatched \"(\" in \"'+v+'\"');if(0==t.units.length)throw new SyntaxError('\"'+e+'\" contains no units');return t.value=void 0!=n?t._normalize(n):null,t},o.prototype.clone=function(){var e=new o;for(var t in this)this.hasOwnProperty(t)&&(e[t]=this[t]);e.dimensions=this.dimensions.slice(0),e.units=[];for(var r=0;r<this.units.length;r++){e.units[r]={};for(var t in this.units[r])this.units[r].hasOwnProperty(t)&&(e.units[r][t]=this.units[r][t])}return e},o.prototype._isDerived=function(){return 0===this.units.length?!1:this.units.length>1||Math.abs(this.units[0].power-1)>1e-15},o.prototype._normalize=function(e){if(0===this.units.length)return e;if(this._isDerived()){for(var t=e,r=0;r<this.units.length;r++)t*=Math.pow(this.units[r].unit.value*this.units[r].prefix.value,this.units[r].power);return t}return(e+this.units[0].unit.offset)*this.units[0].unit.value*this.units[0].prefix.value},o.prototype._denormalize=function(e,t){if(0===this.units.length)return e;if(this._isDerived()){for(var r=e,n=0;n<this.units.length;n++)r/=Math.pow(this.units[n].unit.value*this.units[n].prefix.value,this.units[n].power);return r}return void 0==t?e/this.units[0].unit.value/this.units[0].prefix.value-this.units[0].unit.offset:e/this.units[0].unit.value/t-this.units[0].unit.offset},o.isValuelessUnit=function(e){return null!=g(e)},o.prototype.hasBase=function(e){for(var t=0;t<N.length;t++)if(Math.abs(this.dimensions[t]-e.dimensions[t])>1e-12)return!1;return!0},o.prototype.equalBase=function(e){for(var t=0;t<N.length;t++)if(Math.abs(this.dimensions[t]-e.dimensions[t])>1e-12)return!1;return!0},o.prototype.equals=function(e){return this.equalBase(e)&&this.value==e.value},o.prototype.multiply=function(e){for(var t=this.clone(),r=0;r<N.length;r++)t.dimensions[r]=this.dimensions[r]+e.dimensions[r];for(var r=0;r<e.units.length;r++){var n=JSON.parse(JSON.stringify(e.units[r]));t.units.push(n)}if(null!=this.value||null!=e.value){var i=null==this.value?this._normalize(1):this.value,a=null==e.value?e._normalize(1):e.value;t.value=i*a}else t.value=null;return t.isUnitListSimplified=!1,t},o.prototype.divide=function(e){for(var t=this.clone(),r=0;r<N.length;r++)t.dimensions[r]=this.dimensions[r]-e.dimensions[r];for(var r=0;r<e.units.length;r++){var n=JSON.parse(JSON.stringify(e.units[r]));n.power=-n.power,t.units.push(n)}if(null!=this.value||null!=e.value){var i=null==this.value?this._normalize(1):this.value,a=null==e.value?e._normalize(1):e.value;t.value=i/a}else t.value=null;return t.isUnitListSimplified=!1,t},o.prototype.pow=function(e){for(var t=this.clone(),r=0;r<N.length;r++)t.dimensions[r]=this.dimensions[r]*e;for(var r=0;r<t.units.length;r++)t.units[r].power*=e;return null!=t.value?t.value=Math.pow(t.value,e):t.value=null,t.isUnitListSimplified=!1,t},o.prototype.to=function(e){var t,r=null==this.value?this._normalize(1):this.value;if(\"string\"==typeof e){if(t=o.parse(e),!this.equalBase(t))throw new Error(\"Units do not match\");if(null!==t.value)throw new Error(\"Cannot convert to a unit with a value\");return t.value=r,t.fixPrefix=!0,t.isUnitListSimplified=!0,t}if(e&&e.isUnit){if(!this.equalBase(e))throw new Error(\"Units do not match\");if(null!==e.value)throw new Error(\"Cannot convert to a unit with a value\");return t=e.clone(),t.value=r,t.fixPrefix=!0,t.isUnitListSimplified=!0,t}throw new Error(\"String or Unit expected as parameter\")},o.prototype.toNumber=function(e){var t=this.to(e);return t._isDerived()?t._denormalize(t.value):t._denormalize(t.value,t.units[0].prefix.value)},o.prototype.toString=function(){return this.format()},o.prototype.toJSON=function(){return{mathjs:\"Unit\",value:this._denormalize(this.value),unit:this.formatUnits(),fixPrefix:this.fixPrefix}},o.fromJSON=function(e){var t=new o(e.value,e.unit);return t.fixPrefix=e.fixPrefix||!1,t},o.prototype.valueOf=o.prototype.toString,o.prototype.simplifyUnitListLazy=function(){if(!this.isUnitListSimplified&&null!=this.value){var e,t=[];for(var r in C)if(this.hasBase(E[r])){e=r;break}if(\"NONE\"===e)this.units=[];else{var n;e&&C.hasOwnProperty(e)&&(n=C[e]);if(n)this.units=[{unit:n.unit,prefix:n.prefix,power:1}];else{for(var i=0;i<N.length;i++){var a=N[i];Math.abs(this.dimensions[i])>1e-12&&t.push({unit:C[a].unit,prefix:C[a].prefix,power:this.dimensions[i]})}t.length<this.units.length&&(this.units=t)}}this.isUnitListSimplified=!0}},o.prototype.formatUnits=function(){this.simplifyUnitListLazy();for(var e=\"\",t=\"\",r=0,n=0,i=0;i<this.units.length;i++)this.units[i].power>0?(r++,e+=\" \"+this.units[i].prefix.name+this.units[i].unit.name,Math.abs(this.units[i].power-1)>1e-15&&(e+=\"^\"+this.units[i].power)):this.units[i].power<0&&n++;if(n>0)for(var i=0;i<this.units.length;i++)this.units[i].power<0&&(r>0?(t+=\" \"+this.units[i].prefix.name+this.units[i].unit.name,Math.abs(this.units[i].power+1)>1e-15&&(t+=\"^\"+-this.units[i].power)):(t+=\" \"+this.units[i].prefix.name+this.units[i].unit.name,t+=\"^\"+this.units[i].power));e=e.substr(1),t=t.substr(1),r>1&&n>0&&(e=\"(\"+e+\")\"),\nn>1&&r>0&&(t=\"(\"+t+\")\");var a=e;return r>0&&n>0&&(a+=\" / \"),a+=t},o.prototype.format=function(e){if(this.simplifyUnitListLazy(),1===this.units.length&&!this.fixPrefix&&Math.abs(this.units[0].power-Math.round(this.units[0].power))<1e-14){var t=this._bestPrefix();this.units[0].prefix=t}var r=this._denormalize(this.value),n=null!==this.value?i(r,e):\"\",a=this.formatUnits();return a.length>0&&n.length>0&&(n+=\" \"),n+=a},o.prototype._bestPrefix=function(){if(1!==this.units.length)throw new Error(\"Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!\");if(Math.abs(this.units[0].power-Math.round(this.units[0].power))>=1e-14)throw new Error(\"Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!\");var e=Math.abs(this.value),t=this.units[0].prefix;if(0===e)return t;var r=this.units[0].power,n=Math.abs(Math.log(e/Math.pow(t.value*this.units[0].unit.value,r))/Math.LN10-1.2),i=this.units[0].unit.prefixes;for(var a in i)if(i.hasOwnProperty(a)){var o=i[a];if(o.scientific){var s=Math.abs(Math.log(e/Math.pow(o.value*this.units[0].unit.value,r))/Math.LN10-1.2);(n>s||s===n&&o.name.length<t.name.length)&&(t=o,n=s)}}return t};var x={NONE:{\"\":{name:\"\",value:1,scientific:!0}},SHORT:{\"\":{name:\"\",value:1,scientific:!0},da:{name:\"da\",value:10,scientific:!1},h:{name:\"h\",value:100,scientific:!1},k:{name:\"k\",value:1e3,scientific:!0},M:{name:\"M\",value:1e6,scientific:!0},G:{name:\"G\",value:1e9,scientific:!0},T:{name:\"T\",value:1e12,scientific:!0},P:{name:\"P\",value:1e15,scientific:!0},E:{name:\"E\",value:1e18,scientific:!0},Z:{name:\"Z\",value:1e21,scientific:!0},Y:{name:\"Y\",value:1e24,scientific:!0},d:{name:\"d\",value:.1,scientific:!1},c:{name:\"c\",value:.01,scientific:!1},m:{name:\"m\",value:.001,scientific:!0},u:{name:\"u\",value:1e-6,scientific:!0},n:{name:\"n\",value:1e-9,scientific:!0},p:{name:\"p\",value:1e-12,scientific:!0},f:{name:\"f\",value:1e-15,scientific:!0},a:{name:\"a\",value:1e-18,scientific:!0},z:{name:\"z\",value:1e-21,scientific:!0},y:{name:\"y\",value:1e-24,scientific:!0}},LONG:{\"\":{name:\"\",value:1,scientific:!0},deca:{name:\"deca\",value:10,scientific:!1},hecto:{name:\"hecto\",value:100,scientific:!1},kilo:{name:\"kilo\",value:1e3,scientific:!0},mega:{name:\"mega\",value:1e6,scientific:!0},giga:{name:\"giga\",value:1e9,scientific:!0},tera:{name:\"tera\",value:1e12,scientific:!0},peta:{name:\"peta\",value:1e15,scientific:!0},exa:{name:\"exa\",value:1e18,scientific:!0},zetta:{name:\"zetta\",value:1e21,scientific:!0},yotta:{name:\"yotta\",value:1e24,scientific:!0},deci:{name:\"deci\",value:.1,scientific:!1},centi:{name:\"centi\",value:.01,scientific:!1},milli:{name:\"milli\",value:.001,scientific:!0},micro:{name:\"micro\",value:1e-6,scientific:!0},nano:{name:\"nano\",value:1e-9,scientific:!0},pico:{name:\"pico\",value:1e-12,scientific:!0},femto:{name:\"femto\",value:1e-15,scientific:!0},atto:{name:\"atto\",value:1e-18,scientific:!0},zepto:{name:\"zepto\",value:1e-21,scientific:!0},yocto:{name:\"yocto\",value:1e-24,scientific:!0}},SQUARED:{\"\":{name:\"\",value:1,scientific:!0},da:{name:\"da\",value:100,scientific:!1},h:{name:\"h\",value:1e4,scientific:!1},k:{name:\"k\",value:1e6,scientific:!0},M:{name:\"M\",value:1e12,scientific:!0},G:{name:\"G\",value:1e18,scientific:!0},T:{name:\"T\",value:1e24,scientific:!0},P:{name:\"P\",value:1e30,scientific:!0},E:{name:\"E\",value:1e36,scientific:!0},Z:{name:\"Z\",value:1e42,scientific:!0},Y:{name:\"Y\",value:1e48,scientific:!0},d:{name:\"d\",value:.01,scientific:!1},c:{name:\"c\",value:1e-4,scientific:!1},m:{name:\"m\",value:1e-6,scientific:!0},u:{name:\"u\",value:1e-12,scientific:!0},n:{name:\"n\",value:1e-18,scientific:!0},p:{name:\"p\",value:1e-24,scientific:!0},f:{name:\"f\",value:1e-30,scientific:!0},a:{name:\"a\",value:1e-36,scientific:!0},z:{name:\"z\",value:1e-42,scientific:!0},y:{name:\"y\",value:1e-48,scientific:!0}},CUBIC:{\"\":{name:\"\",value:1,scientific:!0},da:{name:\"da\",value:1e3,scientific:!1},h:{name:\"h\",value:1e6,scientific:!1},k:{name:\"k\",value:1e9,scientific:!0},M:{name:\"M\",value:1e18,scientific:!0},G:{name:\"G\",value:1e27,scientific:!0},T:{name:\"T\",value:1e36,scientific:!0},P:{name:\"P\",value:1e45,scientific:!0},E:{name:\"E\",value:1e54,scientific:!0},Z:{name:\"Z\",value:1e63,scientific:!0},Y:{name:\"Y\",value:1e72,scientific:!0},d:{name:\"d\",value:.001,scientific:!1},c:{name:\"c\",value:1e-6,scientific:!1},m:{name:\"m\",value:1e-9,scientific:!0},u:{name:\"u\",value:1e-18,scientific:!0},n:{name:\"n\",value:1e-27,scientific:!0},p:{name:\"p\",value:1e-36,scientific:!0},f:{name:\"f\",value:1e-45,scientific:!0},a:{name:\"a\",value:1e-54,scientific:!0},z:{name:\"z\",value:1e-63,scientific:!0},y:{name:\"y\",value:1e-72,scientific:!0}},BINARY_SHORT:{\"\":{name:\"\",value:1,scientific:!0},k:{name:\"k\",value:1e3,scientific:!0},M:{name:\"M\",value:1e6,scientific:!0},G:{name:\"G\",value:1e9,scientific:!0},T:{name:\"T\",value:1e12,scientific:!0},P:{name:\"P\",value:1e15,scientific:!0},E:{name:\"E\",value:1e18,scientific:!0},Z:{name:\"Z\",value:1e21,scientific:!0},Y:{name:\"Y\",value:1e24,scientific:!0},Ki:{name:\"Ki\",value:1024,scientific:!0},Mi:{name:\"Mi\",value:Math.pow(1024,2),scientific:!0},Gi:{name:\"Gi\",value:Math.pow(1024,3),scientific:!0},Ti:{name:\"Ti\",value:Math.pow(1024,4),scientific:!0},Pi:{name:\"Pi\",value:Math.pow(1024,5),scientific:!0},Ei:{name:\"Ei\",value:Math.pow(1024,6),scientific:!0},Zi:{name:\"Zi\",value:Math.pow(1024,7),scientific:!0},Yi:{name:\"Yi\",value:Math.pow(1024,8),scientific:!0}},BINARY_LONG:{\"\":{name:\"\",value:1,scientific:!0},kilo:{name:\"kilo\",value:1e3,scientific:!0},mega:{name:\"mega\",value:1e6,scientific:!0},giga:{name:\"giga\",value:1e9,scientific:!0},tera:{name:\"tera\",value:1e12,scientific:!0},peta:{name:\"peta\",value:1e15,scientific:!0},exa:{name:\"exa\",value:1e18,scientific:!0},zetta:{name:\"zetta\",value:1e21,scientific:!0},yotta:{name:\"yotta\",value:1e24,scientific:!0},kibi:{name:\"kibi\",value:1024,scientific:!0},mebi:{name:\"mebi\",value:Math.pow(1024,2),scientific:!0},gibi:{name:\"gibi\",value:Math.pow(1024,3),scientific:!0},tebi:{name:\"tebi\",value:Math.pow(1024,4),scientific:!0},pebi:{name:\"pebi\",value:Math.pow(1024,5),scientific:!0},exi:{name:\"exi\",value:Math.pow(1024,6),scientific:!0},zebi:{name:\"zebi\",value:Math.pow(1024,7),scientific:!0},yobi:{name:\"yobi\",value:Math.pow(1024,8),scientific:!0}},BTU:{\"\":{name:\"\",value:1,scientific:!0},MM:{name:\"MM\",value:1e6,scientific:!0}}};x.SHORTLONG={};for(var w in x.SHORT)x.SHORT.hasOwnProperty(w)&&(x.SHORTLONG[w]=x.SHORT[w]);for(var w in x.LONG)x.LONG.hasOwnProperty(w)&&(x.SHORTLONG[w]=x.LONG[w]);var b={name:\"\",value:1,scientific:!0},N=[\"MASS\",\"LENGTH\",\"TIME\",\"CURRENT\",\"TEMPERATURE\",\"LUMINOUS_INTENSITY\",\"AMOUNT_OF_SUBSTANCE\",\"ANGLE\",\"BIT\"],E={NONE:{dimensions:[0,0,0,0,0,0,0,0,0]},MASS:{dimensions:[1,0,0,0,0,0,0,0,0]},LENGTH:{dimensions:[0,1,0,0,0,0,0,0,0]},TIME:{dimensions:[0,0,1,0,0,0,0,0,0]},CURRENT:{dimensions:[0,0,0,1,0,0,0,0,0]},TEMPERATURE:{dimensions:[0,0,0,0,1,0,0,0,0]},LUMINOUS_INTENSITY:{dimensions:[0,0,0,0,0,1,0,0,0]},AMOUNT_OF_SUBSTANCE:{dimensions:[0,0,0,0,0,0,1,0,0]},FORCE:{dimensions:[1,1,-2,0,0,0,0,0,0]},SURFACE:{dimensions:[0,2,0,0,0,0,0,0,0]},VOLUME:{dimensions:[0,3,0,0,0,0,0,0,0]},ENERGY:{dimensions:[1,2,-2,0,0,0,0,0,0]},POWER:{dimensions:[1,2,-3,0,0,0,0,0,0]},PRESSURE:{dimensions:[1,-1,-2,0,0,0,0,0,0]},ELECTRIC_CHARGE:{dimensions:[0,0,1,1,0,0,0,0,0]},ELECTRIC_CAPACITANCE:{dimensions:[-1,-2,4,2,0,0,0,0,0]},ELECTRIC_POTENTIAL:{dimensions:[1,2,-3,-1,0,0,0,0,0]},ELECTRIC_RESISTANCE:{dimensions:[1,2,-3,-2,0,0,0,0,0]},ELECTRIC_INDUCTANCE:{dimensions:[1,2,-2,-2,0,0,0,0,0]},ELECTRIC_CONDUCTANCE:{dimensions:[-1,-2,3,2,0,0,0,0,0]},MAGNETIC_FLUX:{dimensions:[1,2,-2,-1,0,0,0,0,0]},MAGNETIC_FLUX_DENSITY:{dimensions:[1,0,-2,-1,0,0,0,0,0]},ANGLE:{dimensions:[0,0,0,0,0,0,0,1,0]},BIT:{dimensions:[0,0,0,0,0,0,0,0,1]}};for(var w in E)E[w].key=w;var M={},A={name:\"\",base:M,value:1,offset:0,dimensions:[0,0,0,0,0,0,0,0,0]},_={meter:{name:\"meter\",base:E.LENGTH,prefixes:x.LONG,value:1,offset:0},inch:{name:\"inch\",base:E.LENGTH,prefixes:x.NONE,value:.0254,offset:0},foot:{name:\"foot\",base:E.LENGTH,prefixes:x.NONE,value:.3048,offset:0},yard:{name:\"yard\",base:E.LENGTH,prefixes:x.NONE,value:.9144,offset:0},mile:{name:\"mile\",base:E.LENGTH,prefixes:x.NONE,value:1609.344,offset:0},link:{name:\"link\",base:E.LENGTH,prefixes:x.NONE,value:.201168,offset:0},rod:{name:\"rod\",base:E.LENGTH,prefixes:x.NONE,value:5.02921,offset:0},chain:{name:\"chain\",base:E.LENGTH,prefixes:x.NONE,value:20.1168,offset:0},angstrom:{name:\"angstrom\",base:E.LENGTH,prefixes:x.NONE,value:1e-10,offset:0},m:{name:\"m\",base:E.LENGTH,prefixes:x.SHORT,value:1,offset:0},\"in\":{name:\"in\",base:E.LENGTH,prefixes:x.NONE,value:.0254,offset:0},ft:{name:\"ft\",base:E.LENGTH,prefixes:x.NONE,value:.3048,offset:0},yd:{name:\"yd\",base:E.LENGTH,prefixes:x.NONE,value:.9144,offset:0},mi:{name:\"mi\",base:E.LENGTH,prefixes:x.NONE,value:1609.344,offset:0},li:{name:\"li\",base:E.LENGTH,prefixes:x.NONE,value:.201168,offset:0},rd:{name:\"rd\",base:E.LENGTH,prefixes:x.NONE,value:5.02921,offset:0},ch:{name:\"ch\",base:E.LENGTH,prefixes:x.NONE,value:20.1168,offset:0},mil:{name:\"mil\",base:E.LENGTH,prefixes:x.NONE,value:254e-7,offset:0},m2:{name:\"m2\",base:E.SURFACE,prefixes:x.SQUARED,value:1,offset:0},sqin:{name:\"sqin\",base:E.SURFACE,prefixes:x.NONE,value:64516e-8,offset:0},sqft:{name:\"sqft\",base:E.SURFACE,prefixes:x.NONE,value:.09290304,offset:0},sqyd:{name:\"sqyd\",base:E.SURFACE,prefixes:x.NONE,value:.83612736,offset:0},sqmi:{name:\"sqmi\",base:E.SURFACE,prefixes:x.NONE,value:2589988.110336,offset:0},sqrd:{name:\"sqrd\",base:E.SURFACE,prefixes:x.NONE,value:25.29295,offset:0},sqch:{name:\"sqch\",base:E.SURFACE,prefixes:x.NONE,value:404.6873,offset:0},sqmil:{name:\"sqmil\",base:E.SURFACE,prefixes:x.NONE,value:6.4516e-10,offset:0},m3:{name:\"m3\",base:E.VOLUME,prefixes:x.CUBIC,value:1,offset:0},L:{name:\"L\",base:E.VOLUME,prefixes:x.SHORT,value:.001,offset:0},l:{name:\"l\",base:E.VOLUME,prefixes:x.SHORT,value:.001,offset:0},litre:{name:\"litre\",base:E.VOLUME,prefixes:x.LONG,value:.001,offset:0},cuin:{name:\"cuin\",base:E.VOLUME,prefixes:x.NONE,value:16387064e-12,offset:0},cuft:{name:\"cuft\",base:E.VOLUME,prefixes:x.NONE,value:.028316846592,offset:0},cuyd:{name:\"cuyd\",base:E.VOLUME,prefixes:x.NONE,value:.764554857984,offset:0},teaspoon:{name:\"teaspoon\",base:E.VOLUME,prefixes:x.NONE,value:5e-6,offset:0},tablespoon:{name:\"tablespoon\",base:E.VOLUME,prefixes:x.NONE,value:15e-6,offset:0},drop:{name:\"drop\",base:E.VOLUME,prefixes:x.NONE,value:5e-8,offset:0},gtt:{name:\"gtt\",base:E.VOLUME,prefixes:x.NONE,value:5e-8,offset:0},minim:{name:\"minim\",base:E.VOLUME,prefixes:x.NONE,value:6.161152e-8,offset:0},fluiddram:{name:\"fluiddram\",base:E.VOLUME,prefixes:x.NONE,value:36966911e-13,offset:0},fluidounce:{name:\"fluidounce\",base:E.VOLUME,prefixes:x.NONE,value:2957353e-11,offset:0},gill:{name:\"gill\",base:E.VOLUME,prefixes:x.NONE,value:.0001182941,offset:0},cc:{name:\"cc\",base:E.VOLUME,prefixes:x.NONE,value:1e-6,offset:0},cup:{name:\"cup\",base:E.VOLUME,prefixes:x.NONE,value:.0002365882,offset:0},pint:{name:\"pint\",base:E.VOLUME,prefixes:x.NONE,value:.0004731765,offset:0},quart:{name:\"quart\",base:E.VOLUME,prefixes:x.NONE,value:.0009463529,offset:0},gallon:{name:\"gallon\",base:E.VOLUME,prefixes:x.NONE,value:.003785412,offset:0},beerbarrel:{name:\"beerbarrel\",base:E.VOLUME,prefixes:x.NONE,value:.1173478,offset:0},oilbarrel:{name:\"oilbarrel\",base:E.VOLUME,prefixes:x.NONE,value:.1589873,offset:0},hogshead:{name:\"hogshead\",base:E.VOLUME,prefixes:x.NONE,value:.238481,offset:0},fldr:{name:\"fldr\",base:E.VOLUME,prefixes:x.NONE,value:36966911e-13,offset:0},floz:{name:\"floz\",base:E.VOLUME,prefixes:x.NONE,value:2957353e-11,offset:0},gi:{name:\"gi\",base:E.VOLUME,prefixes:x.NONE,value:.0001182941,offset:0},cp:{name:\"cp\",base:E.VOLUME,prefixes:x.NONE,value:.0002365882,offset:0},pt:{name:\"pt\",base:E.VOLUME,prefixes:x.NONE,value:.0004731765,offset:0},qt:{name:\"qt\",base:E.VOLUME,prefixes:x.NONE,value:.0009463529,offset:0},gal:{name:\"gal\",base:E.VOLUME,prefixes:x.NONE,value:.003785412,offset:0},bbl:{name:\"bbl\",base:E.VOLUME,prefixes:x.NONE,value:.1173478,offset:0},obl:{name:\"obl\",base:E.VOLUME,prefixes:x.NONE,value:.1589873,offset:0},g:{name:\"g\",base:E.MASS,prefixes:x.SHORT,value:.001,offset:0},gram:{name:\"gram\",base:E.MASS,prefixes:x.LONG,value:.001,offset:0},ton:{name:\"ton\",base:E.MASS,prefixes:x.SHORT,value:907.18474,offset:0},tonne:{name:\"tonne\",base:E.MASS,prefixes:x.SHORT,value:1e3,offset:0},grain:{name:\"grain\",base:E.MASS,prefixes:x.NONE,value:6479891e-11,offset:0},dram:{name:\"dram\",base:E.MASS,prefixes:x.NONE,value:.0017718451953125,offset:0},ounce:{name:\"ounce\",base:E.MASS,prefixes:x.NONE,value:.028349523125,offset:0},poundmass:{name:\"poundmass\",base:E.MASS,prefixes:x.NONE,value:.45359237,offset:0},hundredweight:{name:\"hundredweight\",base:E.MASS,prefixes:x.NONE,value:45.359237,offset:0},stick:{name:\"stick\",base:E.MASS,prefixes:x.NONE,value:.115,offset:0},stone:{name:\"stone\",base:E.MASS,prefixes:x.NONE,value:6.35029318,offset:0},gr:{name:\"gr\",base:E.MASS,prefixes:x.NONE,value:6479891e-11,offset:0},dr:{name:\"dr\",base:E.MASS,prefixes:x.NONE,value:.0017718451953125,offset:0},oz:{name:\"oz\",base:E.MASS,prefixes:x.NONE,value:.028349523125,offset:0},lbm:{name:\"lbm\",base:E.MASS,prefixes:x.NONE,value:.45359237,offset:0},cwt:{name:\"cwt\",base:E.MASS,prefixes:x.NONE,value:45.359237,offset:0},s:{name:\"s\",base:E.TIME,prefixes:x.SHORT,value:1,offset:0},min:{name:\"min\",base:E.TIME,prefixes:x.NONE,value:60,offset:0},h:{name:\"h\",base:E.TIME,prefixes:x.NONE,value:3600,offset:0},second:{name:\"second\",base:E.TIME,prefixes:x.LONG,value:1,offset:0},sec:{name:\"sec\",base:E.TIME,prefixes:x.LONG,value:1,offset:0},minute:{name:\"minute\",base:E.TIME,prefixes:x.NONE,value:60,offset:0},hour:{name:\"hour\",base:E.TIME,prefixes:x.NONE,value:3600,offset:0},day:{name:\"day\",base:E.TIME,prefixes:x.NONE,value:86400,offset:0},rad:{name:\"rad\",base:E.ANGLE,prefixes:x.NONE,value:1,offset:0},deg:{name:\"deg\",base:E.ANGLE,prefixes:x.NONE,value:.017453292519943295,offset:0},grad:{name:\"grad\",base:E.ANGLE,prefixes:x.NONE,value:.015707963267948967,offset:0},cycle:{name:\"cycle\",base:E.ANGLE,prefixes:x.NONE,value:6.283185307179586,offset:0},A:{name:\"A\",base:E.CURRENT,prefixes:x.SHORT,value:1,offset:0},ampere:{name:\"ampere\",base:E.CURRENT,prefixes:x.LONG,value:1,offset:0},K:{name:\"K\",base:E.TEMPERATURE,prefixes:x.NONE,value:1,offset:0},degC:{name:\"degC\",base:E.TEMPERATURE,prefixes:x.NONE,value:1,offset:273.15},degF:{name:\"degF\",base:E.TEMPERATURE,prefixes:x.NONE,value:1/1.8,offset:459.67},degR:{name:\"degR\",base:E.TEMPERATURE,prefixes:x.NONE,value:1/1.8,offset:0},kelvin:{name:\"kelvin\",base:E.TEMPERATURE,prefixes:x.NONE,value:1,offset:0},celsius:{name:\"celsius\",base:E.TEMPERATURE,prefixes:x.NONE,value:1,offset:273.15},fahrenheit:{name:\"fahrenheit\",base:E.TEMPERATURE,prefixes:x.NONE,value:1/1.8,offset:459.67},rankine:{name:\"rankine\",base:E.TEMPERATURE,prefixes:x.NONE,value:1/1.8,offset:0},mol:{name:\"mol\",base:E.AMOUNT_OF_SUBSTANCE,prefixes:x.NONE,value:1,offset:0},mole:{name:\"mole\",base:E.AMOUNT_OF_SUBSTANCE,prefixes:x.NONE,value:1,offset:0},cd:{name:\"cd\",base:E.LUMINOUS_INTENSITY,prefixes:x.NONE,value:1,offset:0},candela:{name:\"candela\",base:E.LUMINOUS_INTENSITY,prefixes:x.NONE,value:1,offset:0},N:{name:\"N\",base:E.FORCE,prefixes:x.SHORT,value:1,offset:0},newton:{name:\"newton\",base:E.FORCE,prefixes:x.LONG,value:1,offset:0},dyn:{name:\"dyn\",base:E.FORCE,prefixes:x.SHORT,value:1e-5,offset:0},dyne:{name:\"dyne\",base:E.FORCE,prefixes:x.LONG,value:1e-5,offset:0},lbf:{name:\"lbf\",base:E.FORCE,prefixes:x.NONE,value:4.4482216152605,offset:0},poundforce:{name:\"poundforce\",base:E.FORCE,prefixes:x.NONE,value:4.4482216152605,offset:0},J:{name:\"J\",base:E.ENERGY,prefixes:x.SHORT,value:1,offset:0},joule:{name:\"joule\",base:E.ENERGY,prefixes:x.SHORT,value:1,offset:0},erg:{name:\"erg\",base:E.ENERGY,prefixes:x.NONE,value:1e-5,offset:0},Wh:{name:\"Wh\",base:E.ENERGY,prefixes:x.SHORT,value:3600,offset:0},BTU:{name:\"BTU\",base:E.ENERGY,prefixes:x.BTU,value:1055.05585262,offset:0},eV:{name:\"eV\",base:E.ENERGY,prefixes:x.SHORT,value:1.602176565e-19,offset:0},electronvolt:{name:\"electronvolt\",base:E.ENERGY,prefixes:x.LONG,value:1.602176565e-19,offset:0},W:{name:\"W\",base:E.POWER,prefixes:x.SHORT,value:1,offset:0},watt:{name:\"W\",base:E.POWER,prefixes:x.LONG,value:1,offset:0},hp:{name:\"hp\",base:E.POWER,prefixes:x.NONE,value:745.6998715386,offset:0},Pa:{name:\"Pa\",base:E.PRESSURE,prefixes:x.SHORT,value:1,offset:0},psi:{name:\"psi\",base:E.PRESSURE,prefixes:x.NONE,value:6894.75729276459,offset:0},atm:{name:\"atm\",base:E.PRESSURE,prefixes:x.NONE,value:101325,offset:0},coulomb:{name:\"coulomb\",base:E.ELECTRIC_CHARGE,prefixes:x.LONG,value:1,offset:0},C:{name:\"C\",base:E.ELECTRIC_CHARGE,prefixes:x.SHORT,value:1,offset:0},farad:{name:\"farad\",base:E.ELECTRIC_CAPACITANCE,prefixes:x.LONG,value:1,offset:0},F:{name:\"F\",base:E.ELECTRIC_CAPACITANCE,prefixes:x.SHORT,value:1,offset:0},volt:{name:\"volt\",base:E.ELECTRIC_POTENTIAL,prefixes:x.LONG,value:1,offset:0},V:{name:\"V\",base:E.ELECTRIC_POTENTIAL,prefixes:x.SHORT,value:1,offset:0},ohm:{name:\"ohm\",base:E.ELECTRIC_RESISTANCE,prefixes:x.SHORTLONG,value:1,offset:0},henry:{name:\"henry\",base:E.ELECTRIC_INDUCTANCE,prefixes:x.LONG,value:1,offset:0},H:{name:\"H\",base:E.ELECTRIC_INDUCTANCE,prefixes:x.SHORT,value:1,offset:0},siemens:{name:\"siemens\",base:E.ELECTRIC_CONDUCTANCE,prefixes:x.LONG,value:1,offset:0},S:{name:\"S\",base:E.ELECTRIC_CONDUCTANCE,prefixes:x.SHORT,value:1,offset:0},weber:{name:\"weber\",base:E.MAGNETIC_FLUX,prefixes:x.LONG,value:1,offset:0},Wb:{name:\"Wb\",base:E.MAGNETIC_FLUX,prefixes:x.SHORT,value:1,offset:0},tesla:{name:\"tesla\",base:E.MAGNETIC_FLUX_DENSITY,prefixes:x.LONG,value:1,offset:0},T:{name:\"T\",base:E.MAGNETIC_FLUX_DENSITY,prefixes:x.SHORT,value:1,offset:0},b:{name:\"b\",base:E.BIT,prefixes:x.BINARY_SHORT,value:1,offset:0},bits:{name:\"bits\",base:E.BIT,prefixes:x.BINARY_LONG,value:1,offset:0},B:{name:\"B\",base:E.BIT,prefixes:x.BINARY_SHORT,value:8,offset:0},bytes:{name:\"bytes\",base:E.BIT,prefixes:x.BINARY_LONG,value:8,offset:0}},O={meters:\"meter\",inches:\"inch\",feet:\"foot\",yards:\"yard\",miles:\"mile\",links:\"link\",rods:\"rod\",chains:\"chain\",angstroms:\"angstrom\",litres:\"litre\",teaspoons:\"teaspoon\",tablespoons:\"tablespoon\",minims:\"minim\",fluiddrams:\"fluiddram\",fluidounces:\"fluidounce\",gills:\"gill\",cups:\"cup\",pints:\"pint\",quarts:\"quart\",gallons:\"gallon\",beerbarrels:\"beerbarrel\",oilbarrels:\"oilbarrel\",hogsheads:\"hogshead\",gtts:\"gtt\",grams:\"gram\",tons:\"ton\",tonnes:\"tonne\",grains:\"grain\",drams:\"dram\",ounces:\"ounce\",poundmasses:\"poundmass\",hundredweights:\"hundredweight\",sticks:\"stick\",seconds:\"second\",minutes:\"minute\",hours:\"hour\",days:\"day\",radians:\"rad\",degrees:\"deg\",gradients:\"grad\",cycles:\"cycle\",BTUs:\"BTU\",watts:\"watt\",joules:\"joule\",amperes:\"ampere\",coulombs:\"coulomb\",volts:\"volt\",ohms:\"ohm\",farads:\"farad\",webers:\"weber\",teslas:\"tesla\",electronvolts:\"electronvolt\",moles:\"mole\"},T={si:{NONE:{unit:A,prefix:x.NONE[\"\"]},LENGTH:{unit:_.m,prefix:x.SHORT[\"\"]},MASS:{unit:_.g,prefix:x.SHORT.k},TIME:{unit:_.s,prefix:x.SHORT[\"\"]},CURRENT:{unit:_.A,prefix:x.SHORT[\"\"]},TEMPERATURE:{unit:_.K,prefix:x.SHORT[\"\"]},LUMINOUS_INTENSITY:{unit:_.cd,prefix:x.SHORT[\"\"]},AMOUNT_OF_SUBSTANCE:{unit:_.mol,prefix:x.SHORT[\"\"]},ANGLE:{unit:_.rad,prefix:x.SHORT[\"\"]},BIT:{unit:_.bit,prefix:x.SHORT[\"\"]},FORCE:{unit:_.N,prefix:x.SHORT[\"\"]},ENERGY:{unit:_.J,prefix:x.SHORT[\"\"]},POWER:{unit:_.W,prefix:x.SHORT[\"\"]},PRESSURE:{unit:_.Pa,prefix:x.SHORT[\"\"]},ELECTRIC_CHARGE:{unit:_.C,prefix:x.SHORT[\"\"]},ELECTRIC_CAPACITANCE:{unit:_.F,prefix:x.SHORT[\"\"]},ELECTRIC_POTENTIAL:{unit:_.V,prefix:x.SHORT[\"\"]},ELECTRIC_RESISTANCE:{unit:_.ohm,prefix:x.SHORT[\"\"]},ELECTRIC_INDUCTANCE:{unit:_.H,prefix:x.SHORT[\"\"]},ELECTRIC_CONDUCTANCE:{unit:_.S,prefix:x.SHORT[\"\"]},MAGNETIC_FLUX:{unit:_.Wb,prefix:x.SHORT[\"\"]},MAGNETIC_FLUX_DENSITY:{unit:_.T,prefix:x.SHORT[\"\"]}}};T.cgs=JSON.parse(JSON.stringify(T.si)),T.cgs.LENGTH={unit:_.m,prefix:x.SHORT.c},T.cgs.MASS={unit:_.g,prefix:x.SHORT[\"\"]},T.cgs.FORCE={unit:_.dyn,prefix:x.SHORT[\"\"]},T.cgs.ENERGY={unit:_.erg,prefix:x.NONE[\"\"]},T.us=JSON.parse(JSON.stringify(T.si)),T.us.LENGTH={unit:_.ft,prefix:x.NONE[\"\"]},T.us.MASS={unit:_.lbm,prefix:x.NONE[\"\"]},T.us.TEMPERATURE={unit:_.degF,prefix:x.NONE[\"\"]},T.us.FORCE={unit:_.lbf,prefix:x.NONE[\"\"]},T.us.ENERGY={unit:_.BTU,prefix:x.BTU[\"\"]},T.us.POWER={unit:_.hp,prefix:x.NONE[\"\"]},T.us.PRESSURE={unit:_.psi,prefix:x.NONE[\"\"]},T.auto=JSON.parse(JSON.stringify(T.si));var C=T.auto;o.setUnitSystem=function(e){if(T.hasOwnProperty(e))C=T[e];else{\"Unit system \"+e+\" does not exist. Choices are: \"+listAvailableUnitSystems()}},o.listAvailableUnitSystems=function(){var e=\"\";for(var t in T)e+=\" \"+t;return e.substr(1)},o.getUnitSystem=function(){for(var e in T)if(T[e]===C)return e};for(var w in _){var S=_[w];S.dimensions=S.base.dimensions}for(var z in O)if(O.hasOwnProperty(z)){var S=_[O[z]],B=Object.create(S);B.name=z,_[z]=B}return _.lt=_.l,_.liter=_.litre,_.liters=_.litres,_.lb=_.lbm,_.lbs=_.lbm,o.PREFIXES=x,o.BASE_UNITS=E,o.UNITS=_,o.UNIT_SYSTEMS=T,o}var i=r(6).format,a=r(23).endsWith;t.name=\"Unit\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=a(\"complex\",{\"\":function(){return new e.Complex(0,0)},number:function(t){return new e.Complex(t,0)},\"number, number\":function(t,r){return new e.Complex(t,r)},\"BigNumber, BigNumber\":function(t,r){return new e.Complex(t.toNumber(),r.toNumber())},Complex:function(e){return e.clone()},string:function(t){return e.Complex.parse(t)},Object:function(t){if(\"re\"in t&&\"im\"in t)return new e.Complex(t.re,t.im);if(\"r\"in t&&\"phi\"in t)return e.Complex.fromPolar(t.r,t.phi);throw new Error(\"Expected object with either properties re and im, or properties r and phi.\")},\"Array | Matrix\":function(e){return i(e,s)}});return s.toTex={0:\"0\",1:\"\\\\left(${args[0]}\\\\right)\",2:\"\\\\left(\\\\left(${args[0]}\\\\right)+\"+o.symbols.i+\"\\\\cdot\\\\left(${args[1]}\\\\right)\\\\right)\"},s}var i=r(19);t.name=\"complex\",t.factory=n},function(e,t){\"use strict\";t.symbols={Alpha:\"A\",alpha:\"\\\\alpha\",Beta:\"B\",beta:\"\\\\beta\",Gamma:\"\\\\Gamma\",gamma:\"\\\\gamma\",Delta:\"\\\\Delta\",delta:\"\\\\delta\",Epsilon:\"E\",epsilon:\"\\\\epsilon\",varepsilon:\"\\\\varepsilon\",Zeta:\"Z\",zeta:\"\\\\zeta\",Eta:\"H\",eta:\"\\\\eta\",Theta:\"\\\\Theta\",theta:\"\\\\theta\",vartheta:\"\\\\vartheta\",Iota:\"I\",iota:\"\\\\iota\",Kappa:\"K\",kappa:\"\\\\kappa\",varkappa:\"\\\\varkappa\",Lambda:\"\\\\Lambda\",lambda:\"\\\\lambda\",Mu:\"M\",mu:\"\\\\mu\",Nu:\"N\",nu:\"\\\\nu\",Xi:\"\\\\Xi\",xi:\"\\\\xi\",Omicron:\"O\",omicron:\"o\",Pi:\"\\\\Pi\",pi:\"\\\\pi\",varpi:\"\\\\varpi\",Rho:\"P\",rho:\"\\\\rho\",varrho:\"\\\\varrho\",Sigma:\"\\\\Sigma\",sigma:\"\\\\sigma\",varsigma:\"\\\\varsigma\",Tau:\"T\",tau:\"\\\\tau\",Upsilon:\"\\\\Upsilon\",upsilon:\"\\\\upsilon\",Phi:\"\\\\Phi\",phi:\"\\\\phi\",varphi:\"\\\\varphi\",Chi:\"X\",chi:\"\\\\chi\",Psi:\"\\\\Psi\",psi:\"\\\\psi\",Omega:\"\\\\Omega\",omega:\"\\\\omega\",\"true\":\"\\\\mathrm{True}\",\"false\":\"\\\\mathrm{False}\",i:\"i\",inf:\"\\\\infty\",Inf:\"\\\\infty\",infinity:\"\\\\infty\",Infinity:\"\\\\infty\",oo:\"\\\\infty\",lim:\"\\\\lim\",undefined:\"\\\\mathbf{?}\"},t.operators={transpose:\"^\\\\top\",factorial:\"!\",pow:\"^\",dotPow:\".^\\\\wedge\",unaryPlus:\"+\",unaryMinus:\"-\",bitNot:\"~\",not:\"\\\\neg\",multiply:\"\\\\cdot\",divide:\"\\\\frac\",dotMultiply:\".\\\\cdot\",dotDivide:\".:\",mod:\"\\\\mod\",add:\"+\",subtract:\"-\",to:\"\\\\rightarrow\",leftShift:\"<<\",rightArithShift:\">>\",rightLogShift:\">>>\",equal:\"=\",unequal:\"\\\\neq\",smaller:\"<\",larger:\">\",smallerEq:\"\\\\leq\",largerEq:\"\\\\geq\",bitAnd:\"\\\\&\",bitXor:\"\\\\underline{|}\",bitOr:\"|\",and:\"\\\\wedge\",xor:\"\\\\veebar\",or:\"\\\\vee\"},t.defaultTemplate=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\";var r={deg:\"^\\\\circ\"};t.toSymbol=function(e,n){if(n=\"undefined\"==typeof n?!1:n)return r.hasOwnProperty(e)?r[e]:\"\\\\mathrm{\"+e+\"}\";if(t.symbols.hasOwnProperty(e))return t.symbols[e];if(-1!==e.indexOf(\"_\")){var i=e.indexOf(\"_\");return t.toSymbol(e.substring(0,i))+\"_{\"+t.toSymbol(e.substring(i+1))+\"}\"}return e}},function(e,t,r){e.exports=[r(32),r(36)]},function(e,t,r){function n(e,t,r,n){return i}var i=r(33);i.prototype.type=\"Fraction\",i.prototype.isFraction=!0,i.prototype.toJSON=function(){return{mathjs:\"Fraction\",n:this.s*this.n,d:this.d}},i.fromJSON=function(e){return new i(e)},t.name=\"Fraction\",t.path=\"type\",t.factory=n},function(e,t,r){var n,i;(function(e){/**\n\t * @license Fraction.js v3.0.0 09/09/2015\n\t * http://www.xarg.org/2014/03/precise-calculations-in-javascript/\n\t *\n\t * Copyright (c) 2015, Robert Eisele (robert@xarg.org)\n\t * Dual licensed under the MIT or GPL Version 2 licenses.\n\t **/\n!function(a){\"use strict\";function o(e,t){return isNaN(e=parseInt(e,10))&&s(),e*t}function s(){throw\"Invalid Param\"}function u(e,t){return this instanceof u?(l(e,t),e=u.REDUCE?g(f.d,f.n):1,this.s=f.s,this.n=f.n/e,void(this.d=f.d/e)):new u(e,t)}var c=2e3,f={s:1,n:0,d:1},l=function(e,t){var r,n=0,i=1,a=1,u=0,c=0,l=0,p=1,m=1,h=0,g=1,v=1,d=1,y=1e7;if(void 0===e||null===e);else if(void 0!==t)n=e,i=t,a=n*i;else switch(typeof e){case\"object\":\"d\"in e&&\"n\"in e?(n=e.n,i=e.d,\"s\"in e&&(n*=e.s)):0 in e?(n=e[0],1 in e&&(i=e[1])):s(),a=n*i;break;case\"number\":if(0>e&&(a=e,e=-e),e%1===0)n=e;else if(e>0){for(e>=1&&(m=Math.pow(10,Math.floor(1+Math.log(e)/Math.LN10)),e/=m);y>=g&&y>=d;){if(r=(h+v)/(g+d),e===r){y>=g+d?(n=h+v,i=g+d):d>g?(n=v,i=d):(n=h,i=g);break}e>r?(h+=v,g+=d):(v+=h,d+=g),g>y?(n=v,i=d):(n=h,i=g)}n*=m}break;case\"string\":if(g=e.match(/\\d+|./g),\"-\"===g[h]?(a=-1,h++):\"+\"===g[h]&&h++,g.length===h+1?c=o(g[h++],a):\".\"===g[h+1]||\".\"===g[h]?(\".\"!==g[h]&&(u=o(g[h++],a)),h++,(h+1===g.length||\"(\"===g[h+1]&&\")\"===g[h+3]||\"'\"===g[h+1]&&\"'\"===g[h+3])&&(c=o(g[h],a),p=Math.pow(10,g[h].length),h++),(\"(\"===g[h]&&\")\"===g[h+2]||\"'\"===g[h]&&\"'\"===g[h+2])&&(l=o(g[h+1],a),m=Math.pow(10,g[h+1].length)-1,h+=3)):\"/\"===g[h+1]||\":\"===g[h+1]?(c=o(g[h],a),p=o(g[h+2],1),h+=3):\"/\"===g[h+3]&&\" \"===g[h+1]&&(u=o(g[h],a),c=o(g[h+2],a),p=o(g[h+4],1),h+=5),g.length<=h){a=n=l+m*(u*p+c),i=p*m;break}default:s()}if(!i)throw\"DIV/0\";f.s=0>a?-1:1,f.n=Math.abs(n),f.d=Math.abs(i)},p=function(e,t,r){for(var n=1;t>0;e=e*e%r,t>>=1)1&t&&(n=n*e%r);return n},m=function(e,t){for(;t%2===0;t/=2);for(;t%5===0;t/=5);if(1===t)return 0;for(var r=10%t,n=1;1!==r;n++)if(r=10*r%t,n>c)return 0;return n},h=function(e,t,r){for(var n=1,i=p(10,r,t),a=0;300>a;a++){if(n===i)return a;n=10*n%t,i=10*i%t}return 0},g=function(e,t){if(!e)return t;if(!t)return e;for(;;){if(e%=t,!e)return t;if(t%=e,!t)return e}};u.REDUCE=1,u.prototype={s:1,n:0,d:1,abs:function(){return new u(this.n,this.d)},neg:function(){return new u(-this.s*this.n,this.d)},add:function(e,t){return l(e,t),new u(this.s*this.n*f.d+f.s*this.d*f.n,this.d*f.d)},sub:function(e,t){return l(e,t),new u(this.s*this.n*f.d-f.s*this.d*f.n,this.d*f.d)},mul:function(e,t){return l(e,t),new u(this.s*f.s*this.n*f.n,this.d*f.d)},div:function(e,t){return l(e,t),new u(this.s*f.s*this.n*f.d,this.d*f.n)},clone:function(){return new u(this)},mod:function(e,t){return void 0===e?new u(this.s*this.n%this.d,1):(l(e,t),0===f.n*this.d&&u(0,0),new u(this.s*f.d*this.n%(f.n*this.d),f.d*this.d))},gcd:function(e,t){return l(e,t),new u(g(f.n,this.n),f.d*this.d/g(f.d,this.d))},lcm:function(e,t){return l(e,t),new u(f.n*this.n/g(f.n,this.n),g(f.d,this.d))},ceil:function(){return new u(Math.ceil(this.s*this.n/this.d),1)},floor:function(){return new u(Math.floor(this.s*this.n/this.d),1)},round:function(){return new u(Math.round(this.s*this.n/this.d),1)},inverse:function(){return new u(this.s*this.d,this.n)},pow:function(e){var t=this.d,r=this.n;return 0>e?(this.d=Math.pow(r,-e),this.n=Math.pow(t,-e)):(this.d=Math.pow(t,e),this.n=Math.pow(r,e)),0===e%2&&(this.s=1),this},equals:function(e,t){return l(e,t),this.s*this.n*f.d===f.s*f.n*this.d},compare:function(e,t){l(e,t);var r=this.s*this.n*f.d-f.s*f.n*this.d;return(r>0)-(0>r)},divisible:function(e,t){return l(e,t),!(!(f.n*this.d)||this.n*f.d%(f.n*this.d))},valueOf:function(){return this.s*this.n/this.d},toFraction:function(e){var t,r=\"\",n=this.n,i=this.d;return this.s<0&&(r+=\"-\"),1===i?r+=n:(e&&(t=Math.floor(n/i))>0&&(r+=t,r+=\" \",n%=i),r+=n,r+=\"/\",r+=i),r},toLatex:function(e){var t,r=\"\",n=this.n,i=this.d;return this.s<0&&(r+=\"-\"),1===i?r+=n:(e&&(t=Math.floor(n/i))>0&&(r+=t,n%=i),r+=\"\\\\frac{\",r+=n,r+=\"}{\",r+=i,r+=\"}\"),r},toString:function(){var e,t=this.n,r=this.d;u.REDUCE||(e=g(t,r),t/=e,r/=e);for(var n=String(t).split(\"\"),i=0,a=[~this.s?\"\":\"-\",\"\",\"\"],o=\"\",s=m(t,r),c=h(t,r,s),f=-1,l=1,p=10+s+c+n.length,v=0;p>v;v++,i*=10){if(v<n.length?i+=Number(n[v]):(l=2,f++),s>0)if(f===c)a[l]+=o+\"(\",o=\"\";else if(f===s+c){a[l]+=o+\")\";break}i>=r?(a[l]+=o+(i/r|0),o=\"\",i%=r):l>1?o+=\"0\":a[l]&&(a[l]+=\"0\")}return a[0]+=a[1]||\"0\",a[2]?a[0]+\".\"+a[2]:a[0]}},r(35).amd?(n=[],i=function(){return u}.apply(t,n),!(void 0!==i&&(e.exports=i))):e.exports=u}(this)}).call(t,r(34)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children=[],e.webpackPolyfill=1),e}},function(e,t){e.exports=function(){throw new Error(\"define cannot be used indirect\")}},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"fraction\",{number:function(t){if(!isFinite(t)||isNaN(t))throw new Error(t+\" cannot be represented as a fraction\");return new e.Fraction(t)},string:function(t){return new e.Fraction(t)},\"number, number\":function(t,r){return new e.Fraction(t,r)},Fraction:function(e){return e},Object:function(t){return new e.Fraction(t)},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);t.name=\"fraction\",t.factory=n},function(e,t,r){e.exports=[r(38),r(46),r(47),r(49),r(58),r(64),r(65),r(66),r(67),r(51),r(68)]},function(e,t,r){\"use strict\";function n(e,t,r,n){function i(){if(!(this instanceof i))throw new SyntaxError(\"Constructor must be called with the new operator\")}return i.prototype.type=\"Matrix\",i.prototype.isMatrix=!0,i.storage=function(e){if(!o(e))throw new TypeError(\"format must be a string value\");var t=i._storage[e];if(!t)throw new SyntaxError(\"Unsupported matrix storage format: \"+e);return t},i._storage={},i.prototype.storage=function(){throw new Error(\"Cannot invoke storage on a Matrix interface\")},i.prototype.datatype=function(){throw new Error(\"Cannot invoke datatype on a Matrix interface\")},i.prototype.create=function(e,t){throw new Error(\"Cannot invoke create on a Matrix interface\")},i.prototype.subset=function(e,t,r){throw new Error(\"Cannot invoke subset on a Matrix interface\")},i.prototype.get=function(e){throw new Error(\"Cannot invoke get on a Matrix interface\")},i.prototype.set=function(e,t,r){throw new Error(\"Cannot invoke set on a Matrix interface\")},i.prototype.resize=function(e,t){throw new Error(\"Cannot invoke resize on a Matrix interface\")},i.prototype.clone=function(){throw new Error(\"Cannot invoke clone on a Matrix interface\")},i.prototype.size=function(){throw new Error(\"Cannot invoke size on a Matrix interface\")},i.prototype.map=function(e,t){throw new Error(\"Cannot invoke map on a Matrix interface\")},i.prototype.forEach=function(e){throw new Error(\"Cannot invoke forEach on a Matrix interface\")},i.prototype.toArray=function(){throw new Error(\"Cannot invoke toArray on a Matrix interface\")},i.prototype.valueOf=function(){throw new Error(\"Cannot invoke valueOf on a Matrix interface\")},i.prototype.format=function(e){throw new Error(\"Cannot invoke format on a Matrix interface\")},i.prototype.toString=function(){throw new Error(\"Cannot invoke toString on a Matrix interface\")},i}var i=r(39),a=i.string,o=a.isString;t.name=\"Matrix\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";t.array=r(40),t[\"boolean\"]=r(44),t[\"function\"]=r(45),t.number=r(6),t.object=r(3),t.string=r(23),t.types=r(41),t.emitter=r(8)},function(e,t,r){\"use strict\";function n(e,t,r){var i,a=e.length;if(a!=t[r])throw new f(a,t[r]);if(r<t.length-1){var o=r+1;for(i=0;a>i;i++){var s=e[i];if(!Array.isArray(s))throw new f(t.length-1,t.length,\"<\");n(e[i],t,o)}}else for(i=0;a>i;i++)if(Array.isArray(e[i]))throw new f(t.length+1,t.length,\">\")}function i(e,r,n,a){var o,s,u=e.length,f=r[n],l=Math.min(u,f);if(e.length=f,n<r.length-1){var p=n+1;for(o=0;l>o;o++)s=e[o],Array.isArray(s)||(s=[s],e[o]=s),i(s,r,p,a);for(o=l;f>o;o++)s=[],e[o]=s,i(s,r,p,a)}else{for(o=0;l>o;o++)for(;Array.isArray(e[o]);)e[o]=e[o][0];if(a!==t.UNINITIALIZED)for(o=l;f>o;o++)e[o]=c.clone(a)}}function a(e,t,r){var n,i;if(t>r){var o=r+1;for(n=0,i=e.length;i>n;n++)e[n]=a(e[n],t,o)}else for(;Array.isArray(e);)e=e[0];return e}function o(e,t,r){var n,i;if(Array.isArray(e)){var a=r+1;for(n=0,i=e.length;i>n;n++)e[n]=o(e[n],t,a)}else for(var s=r;t>s;s++)e=[e];return e}var s=r(6),u=r(23),c=r(3),f=(r(41),r(42)),l=r(43);t.size=function(e){for(var t=[];Array.isArray(e);)t.push(e.length),e=e[0];return t},t.validate=function(e,t){var r=0==t.length;if(r){if(Array.isArray(e))throw new f(e.length,0)}else n(e,t,0)},t.validateIndex=function(e,t){if(!s.isNumber(e)||!s.isInteger(e))throw new TypeError(\"Index must be an integer (value: \"+e+\")\");if(0>e)throw new l(e);if(void 0!==t&&e>=t)throw new l(e,t)},t.UNINITIALIZED={},t.resize=function(e,t,r){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError(\"Array expected\");if(0===t.length)throw new Error(\"Resizing to scalar is not supported\");t.forEach(function(e){if(!s.isNumber(e)||!s.isInteger(e)||0>e)throw new TypeError(\"Invalid size, must contain positive integers (size: \"+u.format(t)+\")\")});var n=void 0!==r?r:0;return i(e,t,0,n),e},t.squeeze=function(e,r){for(var n=r||t.size(e);Array.isArray(e)&&1===e.length;)e=e[0],n.shift();for(var i=n.length;1===n[i-1];)i--;return i<n.length&&(e=a(e,i,0),n.length=i),e},t.unsqueeze=function(e,r,n,i){var a=i||t.size(e);if(n)for(var s=0;n>s;s++)e=[e],a.unshift(1);for(e=o(e,r,0);a.length<r;)a.push(1);return e},t.flatten=function(e){if(!Array.isArray(e))return e;var t=[];return e.forEach(function r(e){Array.isArray(e)?e.forEach(r):t.push(e)}),t},t.isArray=Array.isArray},function(e,t){\"use strict\";t.type=function(e){var t=typeof e;return\"object\"===t?null===e?\"null\":e instanceof Boolean?\"boolean\":e instanceof Number?\"number\":e instanceof String?\"string\":Array.isArray(e)?\"Array\":e instanceof Date?\"Date\":e instanceof RegExp?\"RegExp\":\"Object\":\"function\"===t?\"Function\":t}},function(e,t){\"use strict\";function r(e,t,n){if(!(this instanceof r))throw new SyntaxError(\"Constructor must be called with the new operator\");this.actual=e,this.expected=t,this.relation=n,this.message=\"Dimension mismatch (\"+(Array.isArray(e)?\"[\"+e.join(\", \")+\"]\":e)+\" \"+(this.relation||\"!=\")+\" \"+(Array.isArray(t)?\"[\"+t.join(\", \")+\"]\":t)+\")\",this.stack=(new Error).stack}r.prototype=new RangeError,r.prototype.constructor=RangeError,r.prototype.name=\"DimensionError\",r.prototype.isDimensionError=!0,e.exports=r},function(e,t){\"use strict\";function r(e,t,n){if(!(this instanceof r))throw new SyntaxError(\"Constructor must be called with the new operator\");this.index=e,arguments.length<3?(this.min=0,this.max=t):(this.min=t,this.max=n),void 0!==this.min&&this.index<this.min?this.message=\"Index out of range (\"+this.index+\" < \"+this.min+\")\":void 0!==this.max&&this.index>=this.max?this.message=\"Index out of range (\"+this.index+\" > \"+(this.max-1)+\")\":this.message=\"Index out of range (\"+this.index+\")\",this.stack=(new Error).stack}r.prototype=new RangeError,r.prototype.constructor=RangeError,r.prototype.name=\"IndexError\",r.prototype.isIndexError=!0,e.exports=r},function(e,t){\"use strict\";t.isBoolean=function(e){return\"boolean\"==typeof e}},function(e,t){t.memoize=function(e,t){return function r(){\"object\"!=typeof r.cache&&(r.cache={});for(var n=[],i=0;i<arguments.length;i++)n[i]=arguments[i];var a=t?t(n):JSON.stringify(n);return a in r.cache?r.cache[a]:r.cache[a]=e.apply(e,n)}}},function(e,t,r){\"use strict\";function n(e,t,n,c){function g(e,t){if(!(this instanceof g))throw new SyntaxError(\"Constructor must be called with the new operator\");if(t&&!m(t))throw new Error(\"Invalid datatype: \"+t);if(e&&e.isMatrix===!0)\"DenseMatrix\"===e.type?(this._data=u.clone(e._data),this._size=u.clone(e._size),this._datatype=t||e._datatype):(this._data=e.toArray(),this._size=e.size(),this._datatype=t||e._datatype);else if(e&&f(e.data)&&f(e.size))this._data=e.data,this._size=e.size,this._datatype=t||e.datatype;else if(f(e))this._data=b(e),this._size=s.size(this._data),s.validate(this._data,this._size),this._datatype=t;else{if(e)throw new TypeError(\"Unsupported type of data (\"+i.types.type(e)+\")\");this._data=[],this._size=[0],this._datatype=t}}function v(e,t){if(!t||t.isIndex!==!0)throw new TypeError(\"Invalid index\");var r=t.isScalar();if(r)return e.get(t.min());var n=t.size();if(n.length!=e._size.length)throw new a(n.length,e._size.length);for(var i=t.min(),o=t.max(),s=0,u=e._size.length;u>s;s++)h(i[s],e._size[s]),h(o[s],e._size[s]);return new g(d(e._data,t,n.length,0),e._datatype)}function d(e,t,r,n){var i=n==r-1,a=t.dimension(n);return i?a.map(function(t){return e[t]}).valueOf():a.map(function(i){var a=e[i];return d(a,t,r,n+1)}).valueOf()}function y(e,t,r,n){if(!t||t.isIndex!==!0)throw new TypeError(\"Invalid index\");var i,o=t.size(),c=t.isScalar();if(r&&r.isMatrix===!0?(i=r.size(),r=r.valueOf()):i=s.size(r),c){if(0!==i.length)throw new TypeError(\"Scalar expected\");e.set(t.min(),r,n)}else{if(o.length<e._size.length)throw new a(o.length,e._size.length,\"<\");if(i.length<o.length){for(var f=0,l=0;1===o[f]&&1===i[f];)f++;for(;1===o[f];)l++,f++;r=s.unsqueeze(r,o.length,l,i)}if(!u.deepEqual(o,i))throw new a(o,i,\">\");var p=t.max().map(function(e){return e+1});w(e,p,n);var m=o.length,h=0;x(e._data,t,r,m,h)}return e}function x(e,t,r,n,i){var a=i==n-1,o=t.dimension(i);a?o.forEach(function(t,n){h(t),e[t]=r[n[0]]}):o.forEach(function(a,o){h(a),x(e[a],t,r[o[0]],n,i+1)})}function w(e,t,r){for(var n=u.clone(e._size),i=!1;n.length<t.length;)n.push(0),i=!0;for(var a=0,o=t.length;o>a;a++)t[a]>n[a]&&(n[a]=t[a],i=!0);i&&E(e,n,r)}function b(e){for(var t=0,r=e.length;r>t;t++){var n=e[t];f(n)?e[t]=b(n):n&&n.isMatrix===!0&&(e[t]=b(n.valueOf()))}return e}var N=n(r(38));g.prototype=new N,g.prototype.type=\"DenseMatrix\",g.prototype.isDenseMatrix=!0,g.prototype.storage=function(){return\"dense\"},g.prototype.datatype=function(){return this._datatype},g.prototype.create=function(e,t){return new g(e,t)},g.prototype.subset=function(e,t,r){switch(arguments.length){case 1:return v(this,e);case 2:case 3:return y(this,e,t,r);default:throw new SyntaxError(\"Wrong number of arguments\")}},g.prototype.get=function(e){if(!f(e))throw new TypeError(\"Array expected\");if(e.length!=this._size.length)throw new a(e.length,this._size.length);for(var t=0;t<e.length;t++)h(e[t],this._size[t]);for(var r=this._data,n=0,i=e.length;i>n;n++){var o=e[n];h(o,r.length),r=r[o]}return u.clone(r)},g.prototype.set=function(e,t,r){if(!f(e))throw new TypeError(\"Array expected\");if(e.length<this._size.length)throw new a(e.length,this._size.length,\"<\");var n,i,o,s=e.map(function(e){return e+1});w(this,s,r);var u=this._data;for(n=0,i=e.length-1;i>n;n++)o=e[n],h(o,u.length),u=u[o];return o=e[e.length-1],h(o,u.length),u[o]=t,this},g.prototype.resize=function(e,t,r){if(!f(e))throw new TypeError(\"Array expected\");var n=r?this.clone():this;return E(n,e,t)};var E=function(e,t,r){if(0===t.length){for(var n=e._data;f(n);)n=n[0];return u.clone(n)}return e._size=u.clone(t),e._data=s.resize(e._data,e._size,r),e};return g.prototype.clone=function(){var e=new g({data:u.clone(this._data),size:u.clone(this._size),datatype:this._datatype});return e},g.prototype.size=function(){return this._size},g.prototype.map=function(e){var t=this,r=function(n,i){return f(n)?n.map(function(e,t){return r(e,i.concat(t))}):e(n,i,t)};return new g({data:r(this._data,[]),size:u.clone(this._size),datatype:this._datatype})},g.prototype.forEach=function(e){var t=this,r=function(n,i){f(n)?n.forEach(function(e,t){r(e,i.concat(t))}):e(n,i,t)};r(this._data,[])},g.prototype.toArray=function(){return u.clone(this._data)},g.prototype.valueOf=function(){return this._data},g.prototype.format=function(e){return o.format(this._data,e)},g.prototype.toString=function(){return o.format(this._data)},g.prototype.toJSON=function(){return{mathjs:\"DenseMatrix\",data:this._data,size:this._size,datatype:this._datatype}},g.prototype.diagonal=function(e){if(e){if(e.isBigNumber===!0&&(e=e.toNumber()),!l(e)||!p(e))throw new TypeError(\"The parameter k must be an integer number\")}else e=0;for(var t=e>0?e:0,r=0>e?-e:0,n=this._size[0],i=this._size[1],a=Math.min(n-r,i-t),o=[],s=0;a>s;s++)o[s]=u.clone(this._data[s+r][s+t]);return new g({data:o,size:[a],datatype:this._datatype})},g.diagonal=function(t,r,n,i,a){if(!f(t))throw new TypeError(\"Array expected, size parameter\");if(2!==t.length)throw new Error(\"Only two dimensions matrix are supported\");if(t=t.map(function(e){if(e&&e.isBigNumber===!0&&(e=e.toNumber()),!l(e)||!p(e)||1>e)throw new Error(\"Size values must be positive integers\");return e}),n){if(n&&n.isBigNumber===!0&&(n=n.toNumber()),!l(n)||!p(n))throw new TypeError(\"The parameter k must be an integer number\")}else n=0;i&&m(a)&&(i=c.convert(i,a));var o,u=n>0?n:0,h=0>n?-n:0,v=t[0],d=t[1],y=Math.min(v-h,d-u);if(f(r)){if(r.length!==y)throw new Error(\"Invalid value array length\");o=function(e){return r[e]}}else if(r&&r.isMatrix===!0){var x=r.size();if(1!==x.length||x[0]!==y)throw new Error(\"Invalid matrix length\");o=function(e){return r.get([e])}}else o=function(){return r};i||(i=o(0)&&o(0).isBigNumber===!0?new e.BigNumber(0):0);var w=[];if(t.length>0){w=s.resize(w,t,i);for(var b=0;y>b;b++)w[b+h][b+u]=o(b)}return new g({data:w,size:[v,d]})},g.fromJSON=function(e){return new g(e)},g.prototype.swapRows=function(e,t){if(!(l(e)&&p(e)&&l(t)&&p(t)))throw new Error(\"Row index must be positive integers\");if(2!==this._size.length)throw new Error(\"Only two dimensional matrix is supported\");return h(e,this._size[0]),h(t,this._size[0]),g._swapRows(e,t,this._data),this},g._swapRows=function(e,t,r){var n=r[e];r[e]=r[t],r[t]=n},e.Matrix._storage.dense=g,e.Matrix._storage[\"default\"]=g,g}var i=r(39),a=r(42),o=i.string,s=i.array,u=i.object,c=i.number,f=Array.isArray,l=c.isNumber,p=c.isInteger,m=o.isString,h=s.validateIndex;t.name=\"DenseMatrix\",t.path=\"type\",t.factory=n,t.lazy=!1},function(e,t,r){\"use strict\";function n(e,t,n,g){function v(e,t){if(!(this instanceof v))throw new SyntaxError(\"Constructor must be called with the new operator\");if(t&&!m(t))throw new Error(\"Invalid datatype: \"+t);if(e&&e.isMatrix===!0)x(this,e,t);else if(e&&f(e.index)&&f(e.ptr)&&f(e.size))this._values=e.values,this._index=e.index,this._ptr=e.ptr,this._size=e.size,this._datatype=t||e.datatype;else if(f(e))w(this,e,t);else{if(e)throw new TypeError(\"Unsupported type of data (\"+i.types.type(e)+\")\");this._values=[],this._index=[],this._ptr=[0],this._size=[0,0],this._datatype=t}}var d=n(r(38)),y=n(r(48)),x=function(e,t,r){\"SparseMatrix\"===t.type?(e._values=t._values?s.clone(t._values):void 0,e._index=s.clone(t._index),e._ptr=s.clone(t._ptr),e._size=s.clone(t._size),e._datatype=r||t._datatype):w(e,t.valueOf(),r||t._datatype)},w=function(e,t,r){e._values=[],e._index=[],e._ptr=[],e._datatype=r;var n=t.length,i=0,a=y,o=0;if(m(r)&&(a=g.find(y,[r,r])||y,o=g.convert(0,r)),n>0){var s=0;do{e._ptr.push(e._index.length);for(var u=0;n>u;u++){var c=t[u];if(f(c)){if(0===s&&i<c.length&&(i=c.length),s<c.length){var l=c[s];a(l,o)||(e._values.push(l),e._index.push(u))}}else 0===s&&1>i&&(i=1),a(c,o)||(e._values.push(c),e._index.push(u))}s++}while(i>s)}e._ptr.push(e._index.length),e._size=[n,i]};v.prototype=new d,v.prototype.type=\"SparseMatrix\",v.prototype.isSparseMatrix=!0,v.prototype.storage=function(){return\"sparse\"},v.prototype.datatype=function(){return this._datatype},v.prototype.create=function(e,t){return new v(e,t)},v.prototype.density=function(){var e=this._size[0],t=this._size[1];return 0!==e&&0!==t?this._index.length/(e*t):0},v.prototype.subset=function(e,t,r){if(!this._values)throw new Error(\"Cannot invoke subset on a Pattern only matrix\");switch(arguments.length){case 1:return b(this,e);case 2:case 3:return N(this,e,t,r);default:throw new SyntaxError(\"Wrong number of arguments\")}};var b=function(e,t){if(!t||t.isIndex!==!0)throw new TypeError(\"Invalid index\");var r=t.isScalar();if(r)return e.get(t.min());var n=t.size();if(n.length!=e._size.length)throw new a(n.length,e._size.length);var i,o,s,u,c=t.min(),f=t.max();for(i=0,o=e._size.length;o>i;i++)h(c[i],e._size[i]),h(f[i],e._size[i]);var l=e._values,p=e._index,m=e._ptr,g=t.dimension(0),d=t.dimension(1),y=[],x=[];g.forEach(function(e,t){x[e]=t[0],y[e]=!0});var w=l?[]:void 0,b=[],N=[];return d.forEach(function(e){for(N.push(b.length),s=m[e],u=m[e+1];u>s;s++)i=p[s],y[i]===!0&&(b.push(x[i]),w&&w.push(l[s]))}),N.push(b.length),new v({values:w,index:b,ptr:N,size:n,datatype:e._datatype})},N=function(e,t,r,n){if(!t||t.isIndex!==!0)throw new TypeError(\"Invalid index\");var i,u=t.size(),c=t.isScalar();if(r&&r.isMatrix===!0?(i=r.size(),r=r.toArray()):i=o.size(r),c){if(0!==i.length)throw new TypeError(\"Scalar expected\");e.set(t.min(),r,n)}else{if(1!==u.length&&2!==u.length)throw new a(u.length,e._size.length,\"<\");if(i.length<u.length){for(var f=0,l=0;1===u[f]&&1===i[f];)f++;for(;1===u[f];)l++,f++;r=o.unsqueeze(r,u.length,l,i)}if(!s.deepEqual(u,i))throw new a(u,i,\">\");for(var p=t.min()[0],m=t.min()[1],h=i[0],g=i[1],v=0;h>v;v++)for(var d=0;g>d;d++){var y=r[v][d];e.set([v+p,d+m],y,n)}}return e};v.prototype.get=function(e){if(!f(e))throw new TypeError(\"Array expected\");if(e.length!=this._size.length)throw new a(e.length,this._size.length);if(!this._values)throw new Error(\"Cannot invoke get on a Pattern only matrix\");var t=e[0],r=e[1];h(t,this._size[0]),h(r,this._size[1]);var n=E(t,this._ptr[r],this._ptr[r+1],this._index);return n<this._ptr[r+1]&&this._index[n]===t?s.clone(this._values[n]):0},v.prototype.set=function(e,t,r){if(!f(e))throw new TypeError(\"Array expected\");if(e.length!=this._size.length)throw new a(e.length,this._size.length);if(!this._values)throw new Error(\"Cannot invoke set on a Pattern only matrix\");var n=e[0],i=e[1],o=this._size[0],s=this._size[1],u=y,c=0;m(this._datatype)&&(u=g.find(y,[this._datatype,this._datatype])||y,c=g.convert(0,this._datatype)),(n>o-1||i>s-1)&&(_(this,Math.max(n+1,o),Math.max(i+1,s),r),o=this._size[0],s=this._size[1]),h(n,o),h(i,s);var l=E(n,this._ptr[i],this._ptr[i+1],this._index);return l<this._ptr[i+1]&&this._index[l]===n?u(t,c)?M(l,i,this._values,this._index,this._ptr):this._values[l]=t:A(l,n,i,t,this._values,this._index,this._ptr),this};var E=function(e,t,r,n){if(r-t===0)return r;for(var i=t;r>i;i++)if(n[i]===e)return i;return t},M=function(e,t,r,n,i){r.splice(e,1),n.splice(e,1);for(var a=t+1;a<i.length;a++)i[a]--},A=function(e,t,r,n,i,a,o){i.splice(e,0,n),a.splice(e,0,t);for(var s=r+1;s<o.length;s++)o[s]++};v.prototype.resize=function(e,t,r){if(!f(e))throw new TypeError(\"Array expected\");if(2!==e.length)throw new Error(\"Only two dimensions matrix are supported\");e.forEach(function(t){if(!c.isNumber(t)||!c.isInteger(t)||0>t)throw new TypeError(\"Invalid size, must contain positive integers (size: \"+u.format(e)+\")\")});var n=r?this.clone():this;return _(n,e[0],e[1],t)};var _=function(e,t,r,n){var i=n||0,a=y,o=0;m(e._datatype)&&(a=g.find(y,[e._datatype,e._datatype])||y,o=g.convert(0,e._datatype),i=g.convert(i,e._datatype));var s,u,c,f=!a(i,o),l=e._size[0],p=e._size[1];if(r>p){for(u=p;r>u;u++)if(e._ptr[u]=e._values.length,f)for(s=0;l>s;s++)e._values.push(i),e._index.push(s);e._ptr[r]=e._values.length}else p>r&&(e._ptr.splice(r+1,p-r),e._values.splice(e._ptr[r],e._values.length),e._index.splice(e._ptr[r],e._index.length));if(p=r,t>l){if(f){var h=0;for(u=0;p>u;u++){e._ptr[u]=e._ptr[u]+h,c=e._ptr[u+1]+h;var v=0;for(s=l;t>s;s++,v++)e._values.splice(c+v,0,i),e._index.splice(c+v,0,s),h++}e._ptr[p]=e._values.length}}else if(l>t){var d=0;for(u=0;p>u;u++){e._ptr[u]=e._ptr[u]-d;var x=e._ptr[u],w=e._ptr[u+1]-d;for(c=x;w>c;c++)s=e._index[c],s>t-1&&(e._values.splice(c,1),e._index.splice(c,1),d++)}e._ptr[u]=e._values.length}return e._size[0]=t,e._size[1]=r,e};v.prototype.clone=function(){var e=new v({values:this._values?s.clone(this._values):void 0,index:s.clone(this._index),ptr:s.clone(this._ptr),size:s.clone(this._size),datatype:this._datatype});return e},v.prototype.size=function(){return s.clone(this._size)},v.prototype.map=function(e,t){if(!this._values)throw new Error(\"Cannot invoke map on a Pattern only matrix\");var r=this,n=this._size[0],i=this._size[1],a=function(t,n,i){return e(t,[n,i],r)};return O(this,0,n-1,0,i-1,a,t)};var O=function(e,t,r,n,i,a,o){var s=[],u=[],c=[],f=y,l=0;m(e._datatype)&&(f=g.find(y,[e._datatype,e._datatype])||y,l=g.convert(0,e._datatype));for(var p=function(e,t,r){e=a(e,t,r),f(e,l)||(s.push(e),u.push(t))},h=n;i>=h;h++){c.push(s.length);for(var d=e._ptr[h],x=e._ptr[h+1],w=t,b=d;x>b;b++){var N=e._index[b];if(N>=t&&r>=N){if(!o)for(var E=w;N>E;E++)p(0,E-t,h-n);p(e._values[b],N-t,h-n)}w=N+1}if(!o)for(var M=w;r>=M;M++)p(0,M-t,h-n)}return c.push(s.length),new v({values:s,index:u,ptr:c,size:[r-t+1,i-n+1]})};v.prototype.forEach=function(e,t){if(!this._values)throw new Error(\"Cannot invoke forEach on a Pattern only matrix\");for(var r=this,n=this._size[0],i=this._size[1],a=0;i>a;a++){for(var o=this._ptr[a],s=this._ptr[a+1],u=0,c=o;s>c;c++){var f=this._index[c];if(!t)for(var l=u;f>l;l++)e(0,[l,a],r);e(this._values[c],[f,a],r),u=f+1}if(!t)for(var p=u;n>p;p++)e(0,[p,a],r)}},v.prototype.toArray=function(){return T(this._values,this._index,this._ptr,this._size,!0)},v.prototype.valueOf=function(){return T(this._values,this._index,this._ptr,this._size,!1)};var T=function(e,t,r,n,i){var a,o,u=n[0],c=n[1],f=[];for(a=0;u>a;a++)for(f[a]=[],o=0;c>o;o++)f[a][o]=0;for(o=0;c>o;o++)for(var l=r[o],p=r[o+1],m=l;p>m;m++)a=t[m],f[a][o]=e?i?s.clone(e[m]):e[m]:1;return f};return v.prototype.format=function(e){for(var t=this._size[0],r=this._size[1],n=this.density(),i=\"Sparse Matrix [\"+u.format(t,e)+\" x \"+u.format(r,e)+\"] density: \"+u.format(n,e)+\"\\n\",a=0;r>a;a++)for(var o=this._ptr[a],s=this._ptr[a+1],c=o;s>c;c++){var f=this._index[c];i+=\"\\n    (\"+u.format(f,e)+\", \"+u.format(a,e)+\") ==> \"+(this._values?u.format(this._values[c],e):\"X\")}return i},v.prototype.toString=function(){return u.format(this.toArray())},v.prototype.toJSON=function(){return{mathjs:\"SparseMatrix\",values:this._values,index:this._index,ptr:this._ptr,size:this._size,datatype:this._datatype}},v.prototype.diagonal=function(e){if(e){if(e.isBigNumber===!0&&(e=e.toNumber()),!l(e)||!p(e))throw new TypeError(\"The parameter k must be an integer number\")}else e=0;var t=e>0?e:0,r=0>e?-e:0,n=this._size[0],i=this._size[1],a=Math.min(n-r,i-t),o=[],u=[],c=[];c[0]=0;for(var f=t;i>f&&o.length<a;f++)for(var m=this._ptr[f],h=this._ptr[f+1],g=m;h>g;g++){var d=this._index[g];if(d===f-t+r){o.push(s.clone(this._values[g])),u[o.length-1]=d-r;break}}return c.push(o.length),new v({values:o,index:u,ptr:c,size:[a,1]})},v.fromJSON=function(e){return new v(e)},v.diagonal=function(e,t,r,n,i){if(!f(e))throw new TypeError(\"Array expected, size parameter\");if(2!==e.length)throw new Error(\"Only two dimensions matrix are supported\");if(e=e.map(function(e){if(e&&e.isBigNumber===!0&&(e=e.toNumber()),!l(e)||!p(e)||1>e)throw new Error(\"Size values must be positive integers\");return e}),r){if(r.isBigNumber===!0&&(r=r.toNumber()),!l(r)||!p(r))throw new TypeError(\"The parameter k must be an integer number\")}else r=0;var a=y,o=0;m(i)&&(a=g.find(y,[i,i])||y,o=g.convert(0,i));var s,u=r>0?r:0,c=0>r?-r:0,h=e[0],d=e[1],x=Math.min(h-c,d-u);if(f(t)){if(t.length!==x)throw new Error(\"Invalid value array length\");s=function(e){return t[e]}}else if(t&&t.isMatrix===!0){var w=t.size();if(1!==w.length||w[0]!==x)throw new Error(\"Invalid matrix length\");s=function(e){return t.get([e])}}else s=function(){return t};for(var b=[],N=[],E=[],M=0;d>M;M++){E.push(b.length);var A=M-u;if(A>=0&&x>A){var _=s(A);a(_,o)||(N.push(A+c),b.push(_))}}return E.push(b.length),new v({values:b,index:N,ptr:E,size:[h,d]})},v.prototype.swapRows=function(e,t){if(!(l(e)&&p(e)&&l(t)&&p(t)))throw new Error(\"Row index must be positive integers\");if(2!==this._size.length)throw new Error(\"Only two dimensional matrix is supported\");return h(e,this._size[0]),h(t,this._size[0]),v._swapRows(e,t,this._size[1],this._values,this._index,this._ptr),this},v._forEachRow=function(e,t,r,n,i){for(var a=n[e],o=n[e+1],s=a;o>s;s++)i(r[s],t[s])},v._swapRows=function(e,t,r,n,i,a){for(var o=0;r>o;o++){var s=a[o],u=a[o+1],c=E(e,s,u,i),f=E(t,s,u,i);if(u>c&&u>f&&i[c]===e&&i[f]===t){if(n){var l=n[c];n[c]=n[f],n[f]=l}}else if(u>c&&i[c]===e&&(f>=u||i[f]!==t)){var p=n?n[c]:void 0;i.splice(f,0,t),n&&n.splice(f,0,p),i.splice(c>=f?c+1:c,1),n&&n.splice(c>=f?c+1:c,1)}else if(u>f&&i[f]===t&&(c>=u||i[c]!==e)){var m=n?n[f]:void 0;i.splice(c,0,e),n&&n.splice(c,0,m),i.splice(f>=c?f+1:f,1),n&&n.splice(f>=c?f+1:f,1)}}},e.Matrix._storage.sparse=v,v}var i=r(39),a=r(42),o=i.array,s=i.object,u=i.string,c=i.number,f=Array.isArray,l=c.isNumber,p=c.isInteger,m=u.isString,h=o.validateIndex;t.name=\"SparseMatrix\",t.path=\"type\",t.factory=n,t.lazy=!1},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"equalScalar\",{\"boolean, boolean\":function(e,t){return e===t},\"number, number\":function(e,r){return e===r||i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return e.eq(t)},\"Fraction, Fraction\":function(e,t){return e.equals(t)},\"Complex, Complex\":function(e,r){return(e.re===r.re||i(e.re,r.re,t.epsilon))&&(e.im===r.im||i(e.im,r.im,t.epsilon))},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value===r.value||i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return e===t}});return a}var i=r(6).nearlyEqual;t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){function i(){if(!(this instanceof i))throw new SyntaxError(\"Constructor must be called with the new operator\");this._values=[],this._heap=new e.FibonacciHeap}var a=n(r(50)),o=n(r(48));return i.prototype.type=\"Spa\",i.prototype.isSpa=!0,i.prototype.set=function(e,t){if(this._values[e])this._values[e].value=t;else{var r=this._heap.insert(e,t);this._values[e]=r}},i.prototype.get=function(e){var t=this._values[e];return t?t.value:0},i.prototype.accumulate=function(e,t){var r=this._values[e];r?r.value=a(r.value,t):(r=this._heap.insert(e,t),this._values[e]=r)},i.prototype.forEach=function(e,t,r){var n=this._heap,i=this._values,a=[],s=n.extractMinimum();for(s&&a.push(s);s&&s.key<=t;)s.key>=e&&(o(s.value,0)||r(s.key,s.value,this)),s=n.extractMinimum(),s&&a.push(s);for(var u=0;u<a.length;u++){var c=a[u];s=n.insert(c.key,c.value),i[s.key]=s}},i.prototype.swap=function(e,t){var r=this._values[e],n=this._values[t];if(!r&&n)r=this._heap.insert(e,n.value),this._heap.remove(n),this._values[e]=r,this._values[t]=void 0;else if(r&&!n)n=this._heap.insert(t,r.value),this._heap.remove(r),this._values[t]=n,this._values[e]=void 0;else if(r&&n){var i=r.value;r.value=n.value,n.value=i}},i}t.name=\"Spa\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(52)),u=r(30),c=n(r(53)),f=n(r(54)),l=n(r(55)),p=n(r(56)),m=n(r(57)),h=a(\"add\",i({\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,s);break;default:r=c(t,e,s,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,s,!1);break;default:r=p(e,t,s)}}return r},\"Array, Array\":function(e,t){return h(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(o(e),t)},\"Matrix, Array\":function(e,t){return h(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,s,!1);break;default:r=m(e,t,s,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,s,!0);break;default:r=m(t,e,s,!0)}return r},\"Array, any\":function(e,t){return m(o(e),t,s,!1).valueOf()},\"any, Array\":function(e,t){return m(o(t),e,s,!0).valueOf()}},s.signatures));return h.toTex=\"\\\\left(${args[0]}\"+u.operators.add+\"${args[1]}\\\\right)\",h}var i=r(3).extend;t.name=\"add\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){function i(t,r,n){var i=e.Matrix.storage(r||\"default\");return new i(t,n)}var a=n(\"matrix\",{\"\":function(){return i([])},string:function(e){return i([],e)},\"string, string\":function(e,t){return i([],e,t)},Array:function(e){return i(e)},Matrix:function(e){return i(e,e.storage())},\"Array | Matrix, string\":i,\"Array | Matrix, string, string\":i});return a.toTex={0:\"\\\\begin{bmatrix}\\\\end{bmatrix}\",1:\"\\\\left(${args[0]}\\\\right)\",2:\"\\\\left(${args[0]}\\\\right)\"},a}t.name=\"matrix\",t.factory=r},function(e,t){\"use strict\";function r(e,t,r,n){return n(\"add\",{\"number, number\":function(e,t){return e+t},\"Complex, Complex\":function(t,r){return new e.Complex(t.re+r.re,t.im+r.im);\n},\"BigNumber, BigNumber\":function(e,t){return e.plus(t)},\"Fraction, Fraction\":function(e,t){return e.add(t)},\"Unit, Unit\":function(e,t){if(null==e.value)throw new Error(\"Parameter x contains a unit with undefined value\");if(null==t.value)throw new Error(\"Parameter y contains a unit with undefined value\");if(!e.equalBase(t))throw new Error(\"Units do not match\");var r=e.clone();return r.value+=t.value,r.fixPrefix=!1,r}})}t.factory=r},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=e.DenseMatrix,o=function(e,t,r,o){var s=e._data,u=e._size,c=e._datatype,f=t._values,l=t._index,p=t._ptr,m=t._size,h=t._datatype;if(u.length!==m.length)throw new i(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+u+\") must match Matrix B (\"+m+\")\");if(!f)throw new Error(\"Cannot perform operation on Dense Matrix and Pattern Sparse Matrix\");var g,v,d=u[0],y=u[1],x=\"string\"==typeof c&&c===h?c:void 0,w=x?n.find(r,[x,x]):r,b=[];for(g=0;d>g;g++)b[g]=[];var N=[],E=[];for(v=0;y>v;v++){for(var M=v+1,A=p[v],_=p[v+1],O=A;_>O;O++)g=l[O],N[g]=o?w(f[O],s[g][v]):w(s[g][v],f[O]),E[g]=M;for(g=0;d>g;g++)E[g]===M?b[g][v]=N[g]:b[g][v]=s[g][v]}return new a({data:b,size:[d,y],datatype:x})};return o}var i=r(42);t.name=\"algorithm01\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(48)),s=e.SparseMatrix,u=function(e,t,r){var n=e._values,u=e._index,c=e._ptr,f=e._size,l=e._datatype,p=t._values,m=t._index,h=t._ptr,g=t._size,v=t._datatype;if(f.length!==g.length)throw new i(f.length,g.length);if(f[0]!==g[0]||f[1]!==g[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+f+\") must match Matrix B (\"+g+\")\");var d,y=f[0],x=f[1],w=o,b=0,N=r;\"string\"==typeof l&&l===v&&(d=l,w=a.find(o,[d,d]),b=a.convert(0,d),N=a.find(r,[d,d]));var E,M,A,_,O,T=n&&p?[]:void 0,C=[],S=[],z=new s({values:T,index:C,ptr:S,size:[y,x],datatype:d}),B=n&&p?[]:void 0,k=n&&p?[]:void 0,I=[],R=[];for(M=0;x>M;M++){S[M]=C.length;var P=M+1;for(_=c[M],O=c[M+1],A=_;O>A;A++)E=u[A],C.push(E),I[E]=P,B&&(B[E]=n[A]);for(_=h[M],O=h[M+1],A=_;O>A;A++)if(E=m[A],I[E]===P){if(B){var U=N(B[E],p[A]);w(U,b)?I[E]=null:B[E]=U}}else C.push(E),R[E]=P,k&&(k[E]=p[A]);if(B&&k)for(A=S[M];A<C.length;)E=C[A],I[E]===P?(T[A]=B[E],A++):R[E]===P?(T[A]=k[E],A++):C.splice(A,1)}return S[x]=C.length,z};return u}var i=r(42);t.name=\"algorithm04\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){var i=e.DenseMatrix,a=function(e,t,r,a){var o=e._values,s=e._index,u=e._ptr,c=e._size,f=e._datatype;if(!o)throw new Error(\"Cannot perform operation on Pattern Sparse Matrix and Scalar value\");var l,p=c[0],m=c[1],h=r;\"string\"==typeof f&&(l=f,t=n.convert(t,l),h=n.find(r,[l,l]));for(var g=[],v=new i({data:g,size:[p,m],datatype:l}),d=[],y=[],x=0;m>x;x++){for(var w=x+1,b=u[x],N=u[x+1],E=b;N>E;E++){var M=s[E];d[M]=o[E],y[M]=w}for(var A=0;p>A;A++)0===x&&(g[A]=[]),y[A]===w?g[A][x]=a?h(t,d[A]):h(d[A],t):g[A][x]=t}return v};return a}t.name=\"algorithm10\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,r,n){var i=e.DenseMatrix,o=function(e,t,r){var o=e._data,u=e._size,c=e._datatype,f=t._data,l=t._size,p=t._datatype,m=[];if(u.length!==l.length)throw new a(u.length,l.length);for(var h=0;h<u.length;h++){if(u[h]!==l[h])throw new RangeError(\"Dimension mismatch. Matrix A (\"+u+\") must match Matrix B (\"+l+\")\");m[h]=u[h]}var g,v=r;\"string\"==typeof c&&c===p&&(g=c,t=n.convert(t,g),v=n.find(r,[g,g]));var d=m.length>0?s(v,0,m,m[0],o,f):[];return new i({data:d,size:m,datatype:g})},s=function(e,t,r,n,i,a){var o=[];if(t===r.length-1)for(var u=0;n>u;u++)o[u]=e(i[u],a[u]);else for(var c=0;n>c;c++)o[c]=s(e,t+1,r,r[t+1],i[c],a[c]);return o};return o}var i=r(39),a=r(42),o=i.string;o.isString;t.name=\"algorithm13\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=e.DenseMatrix,o=function(e,t,r,o){var u,c=e._data,f=e._size,l=e._datatype,p=r;\"string\"==typeof l&&(u=l,t=n.convert(t,u),p=n.find(r,[u,u]));var m=f.length>0?s(p,0,f,f[0],c,t,o):[];return new a({data:m,size:i(f),datatype:u})},s=function(e,t,r,n,i,a,o){var u=[];if(t===r.length-1)for(var c=0;n>c;c++)u[c]=o?e(a,i[c]):e(i[c],a);else for(var f=0;n>f;f++)u[f]=s(e,t+1,r,r[t+1],i[f],a,o);return u};return o}var i=r(3).clone;t.name=\"algorithm14\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");this._minimum=null,this._size=0}var o=n(r(59)),s=n(r(63)),u=1/Math.log((1+Math.sqrt(5))/2);a.prototype.type=\"FibonacciHeap\",a.prototype.isFibonacciHeap=!0,a.prototype.insert=function(e,t){var r={key:e,value:t,degree:0};if(this._minimum){var n=this._minimum;r.left=n,r.right=n.right,n.right=r,r.right.left=r,o(e,n.key)&&(this._minimum=r)}else r.left=r,r.right=r,this._minimum=r;return this._size++,r},a.prototype.size=function(){return this._size},a.prototype.clear=function(){this._minimum=null,this._size=0},a.prototype.isEmpty=function(){return!!this._minimum},a.prototype.extractMinimum=function(){var e=this._minimum;if(null===e)return e;for(var t=this._minimum,r=e.degree,n=e.child;r>0;){var i=n.right;n.left.right=n.right,n.right.left=n.left,n.left=t,n.right=t.right,t.right=n,n.right.left=n,n.parent=null,n=i,r--}return e.left.right=e.right,e.right.left=e.left,e==e.right?t=null:(t=e.right,t=m(t,this._size)),this._size--,this._minimum=t,e},a.prototype.remove=function(e){this._minimum=c(this._minimum,e,-1),this.extractMinimum()};var c=function(e,t,r){t.key=r;var n=t.parent;return n&&o(t.key,n.key)&&(f(e,t,n),l(e,n)),o(t.key,e.key)&&(e=t),e},f=function(e,t,r){t.left.right=t.right,t.right.left=t.left,r.degree--,r.child==t&&(r.child=t.right),0===r.degree&&(r.child=null),t.left=e,t.right=e.right,e.right=t,t.right.left=t,t.parent=null,t.mark=!1},l=function(e,t){var r=t.parent;r&&(t.mark?(f(e,t,r),l(r)):t.mark=!0)},p=function(e,t){e.left.right=e.right,e.right.left=e.left,e.parent=t,t.child?(e.left=t.child,e.right=t.child.right,t.child.right=e,e.right.left=e):(t.child=e,e.right=e,e.left=e),t.degree++,e.mark=!1},m=function(e,t){var r=Math.floor(Math.log(t)*u)+1,n=new Array(r),i=0,a=e;if(a)for(i++,a=a.right;a!==e;)i++,a=a.right;for(var c;i>0;){for(var f=a.degree,l=a.right;;){if(c=n[f],!c)break;if(s(a.key,c.key)){var m=c;c=a,a=m}p(c,a),n[f]=null,f++}n[f]=a,a=l,i--}e=null;for(var h=0;r>h;h++)c=n[h],c&&(e?(c.left.right=c.right,c.right.left=c.left,c.left=e,c.right=e.right,e.right=c,c.right.left=c,o(c.key,e.key)&&(e=c)):e=c);return e};return a}t.name=\"FibonacciHeap\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=a(\"smaller\",{\"boolean, boolean\":function(e,t){return t>e},\"number, number\":function(e,r){return r>e&&!i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return e.lt(t)},\"Fraction, Fraction\":function(e,t){return-1===e.compare(t)},\"Complex, Complex\":function(e,t){throw new TypeError(\"No ordering relation is defined for complex numbers\")},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value<r.value&&!i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return t>e},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,m);break;default:r=s(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,m,!1);break;default:r=f(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(o(e),t)},\"Matrix, Array\":function(e,t){return m(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,m,!1);break;default:r=l(e,t,m,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,m,!0);break;default:r=l(t,e,m,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,m,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,m,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.smaller+\"${args[1]}\\\\right)\",m}var i=r(6).nearlyEqual;t.name=\"smaller\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=e.DenseMatrix,o=function(e,t,r,o){var s=e._data,u=e._size,c=e._datatype,f=t._values,l=t._index,p=t._ptr,m=t._size,h=t._datatype;if(u.length!==m.length)throw new i(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+u+\") must match Matrix B (\"+m+\")\");if(!f)throw new Error(\"Cannot perform operation on Dense Matrix and Pattern Sparse Matrix\");var g,v=u[0],d=u[1],y=0,x=r;\"string\"==typeof c&&c===h&&(g=c,y=n.convert(0,g),x=n.find(r,[g,g]));for(var w=[],b=0;v>b;b++)w[b]=[];for(var N=[],E=[],M=0;d>M;M++){for(var A=M+1,_=p[M],O=p[M+1],T=_;O>T;T++){var C=l[T];N[C]=o?x(f[T],s[C][M]):x(s[C][M],f[T]),E[C]=A}for(var S=0;v>S;S++)E[S]===A?w[S][M]=N[S]:w[S][M]=o?x(y,s[S][M]):x(s[S][M],y)}return new a({data:w,size:[v,d],datatype:g})};return o}var i=r(42);t.name=\"algorithm03\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=e.DenseMatrix,o=function(e,t,r){var o=e._size,u=e._datatype,c=t._size,f=t._datatype;if(o.length!==c.length)throw new i(o.length,c.length);if(o[0]!==c[0]||o[1]!==c[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+o+\") must match Matrix B (\"+c+\")\");var l,p=o[0],m=o[1],h=0,g=r;\"string\"==typeof u&&u===f&&(l=u,h=n.convert(0,l),g=n.find(r,[l,l]));var v,d,y=[];for(v=0;p>v;v++)y[v]=[];var x=new a({data:y,size:[p,m],datatype:l}),w=[],b=[],N=[],E=[];for(d=0;m>d;d++){var M=d+1;for(s(e,d,N,w,M),s(t,d,E,b,M),v=0;p>v;v++){var A=N[v]===M?w[v]:h,_=E[v]===M?b[v]:h;y[v][d]=g(A,_)}}return x},s=function(e,t,r,n,i){for(var a=e._values,o=e._index,s=e._ptr,u=s[t],c=s[t+1];c>u;u++){var f=o[u];r[f]=i,n[f]=a[u]}};return o}var i=r(42);t.name=\"algorithm07\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){var i=e.DenseMatrix,a=function(e,t,r,a){var o=e._values,s=e._index,u=e._ptr,c=e._size,f=e._datatype;if(!o)throw new Error(\"Cannot perform operation on Pattern Sparse Matrix and Scalar value\");var l,p=c[0],m=c[1],h=r;\"string\"==typeof f&&(l=f,t=n.convert(t,l),h=n.find(r,[l,l]));for(var g=[],v=new i({data:g,size:[p,m],datatype:l}),d=[],y=[],x=0;m>x;x++){for(var w=x+1,b=u[x],N=u[x+1],E=b;N>E;E++){var M=s[E];d[M]=o[E],y[M]=w}for(var A=0;p>A;A++)0===x&&(g[A]=[]),y[A]===w?g[A][x]=a?h(t,d[A]):h(d[A],t):g[A][x]=a?h(t,0):h(0,t)}return v};return a}t.name=\"algorithm12\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=a(\"larger\",{\"boolean, boolean\":function(e,t){return e>t},\"number, number\":function(e,r){return e>r&&!i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return e.gt(t)},\"Fraction, Fraction\":function(e,t){return 1===e.compare(t)},\"Complex, Complex\":function(){throw new TypeError(\"No ordering relation is defined for complex numbers\")},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value>r.value&&!i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return e>t},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,m);break;default:r=s(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,m,!1);break;default:r=f(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(o(e),t)},\"Matrix, Array\":function(e,t){return m(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,m,!1);break;default:r=l(e,t,m,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,m,!0);break;default:r=l(t,e,m,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,m,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,m,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.larger+\"${args[1]}\\\\right)\",m}var i=r(6).nearlyEqual;t.name=\"larger\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){function a(e,t){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(t&&!u(t))throw new Error(\"Invalid datatype: \"+t);if(e&&e.isMatrix===!0||s(e)){var r=new c(e,t);this._data=r._data,this._size=r._size,this._datatype=r._datatype,this._min=null,this._max=null}else if(e&&s(e.data)&&s(e.size))this._data=e.data,this._size=e.size,this._datatype=e.datatype,this._min=\"undefined\"!=typeof e.min?e.min:null,this._max=\"undefined\"!=typeof e.max?e.max:null;else{if(e)throw new TypeError(\"Unsupported type of data (\"+i.types.type(e)+\")\");this._data=[],this._size=[0],this._datatype=t,this._min=null,this._max=null}}var c=n(r(46)),f=n(r(59));return a.prototype=new c,a.prototype.type=\"ImmutableDenseMatrix\",a.prototype.isImmutableDenseMatrix=!0,a.prototype.subset=function(e){switch(arguments.length){case 1:var t=c.prototype.subset.call(this,e);return t.isMatrix?new a({data:t._data,size:t._size,datatype:t._datatype}):t;case 2:case 3:throw new Error(\"Cannot invoke set subset on an Immutable Matrix instance\");default:throw new SyntaxError(\"Wrong number of arguments\")}},a.prototype.set=function(){throw new Error(\"Cannot invoke set on an Immutable Matrix instance\")},a.prototype.resize=function(){throw new Error(\"Cannot invoke resize on an Immutable Matrix instance\")},a.prototype.clone=function(){var e=new a({data:o.clone(this._data),size:o.clone(this._size),datatype:this._datatype});return e},a.prototype.toJSON=function(){return{mathjs:\"ImmutableDenseMatrix\",data:this._data,size:this._size,datatype:this._datatype}},a.fromJSON=function(e){return new a(e)},a.prototype.swapRows=function(){throw new Error(\"Cannot invoke swapRows on an Immutable Matrix instance\")},a.prototype.min=function(){if(null===this._min){var e=null;this.forEach(function(t){(null===e||f(t,e))&&(e=t)}),this._min=null!==e?e:void 0}return this._min},a.prototype.max=function(){if(null===this._max){var e=null;this.forEach(function(t){(null===e||f(e,t))&&(e=t)}),this._max=null!==e?e:void 0}return this._max},a}var i=r(39),a=i.string,o=i.object,s=Array.isArray,u=a.isString;t.name=\"ImmutableDenseMatrix\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e){function t(e){if(!(this instanceof t))throw new SyntaxError(\"Constructor must be called with the new operator\");this._dimensions=[],this._isScalar=!0;for(var n=0,i=arguments.length;i>n;n++){var a=arguments[n];if(a&&a.isRange===!0)this._dimensions.push(a),this._isScalar=!1;else if(a&&(Array.isArray(a)||a.isMatrix===!0)){var o=r(a.valueOf());this._dimensions.push(o);var s=o.size();this._isScalar=1===s.length&&1===s[0]}else{if(\"number\"!=typeof a)throw new TypeError(\"Dimension must be an Array, Matrix, Number or Range\");this._dimensions.push(r([a]))}}}function r(t){for(var r=0,n=t.length;n>r;r++)if(\"number\"!=typeof t[r]||!a(t[r]))throw new TypeError(\"Index parameters must be positive integer numbers\");return new e.ImmutableDenseMatrix(t)}return t.prototype.type=\"Index\",t.prototype.isIndex=!0,t.prototype.clone=function(){var e=new t;return e._dimensions=i(this._dimensions),e._isScalar=this._isScalar,e},t.create=function(e){var r=new t;return t.apply(r,e),r},t.prototype.size=function(){for(var e=[],t=0,r=this._dimensions.length;r>t;t++){var n=this._dimensions[t];e[t]=n.size()[0]}return e},t.prototype.max=function(){for(var e=[],t=0,r=this._dimensions.length;r>t;t++){var n=this._dimensions[t];e[t]=n.max()}return e},t.prototype.min=function(){for(var e=[],t=0,r=this._dimensions.length;r>t;t++){var n=this._dimensions[t];e[t]=n.min()}return e},t.prototype.forEach=function(e){for(var t=0,r=this._dimensions.length;r>t;t++)e(this._dimensions[t],t,this)},t.prototype.dimension=function(e){return this._dimensions[e]||null},t.prototype.isScalar=function(){return this._isScalar},t.prototype.toArray=function(){for(var e=[],t=0,r=this._dimensions.length;r>t;t++)e.push(this._dimensions[t].toArray());return e},t.prototype.valueOf=t.prototype.toArray,t.prototype.toString=function(){for(var e=[],t=0,r=this._dimensions.length;r>t;t++)e.push(this._dimensions[t].toString());return\"[\"+e.join(\", \")+\"]\"},t.prototype.toJSON=function(){return{mathjs:\"Index\",dimensions:this._dimensions}},t.fromJSON=function(e){return t.create(e.dimensions)},t}var i=r(3).clone,a=r(6).isInteger;t.name=\"Index\",t.path=\"type\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){function a(e,t,r){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(null!=e)if(e.isBigNumber===!0)e=e.toNumber();else if(\"number\"!=typeof e)throw new TypeError(\"Parameter start must be a number\");if(null!=t)if(t.isBigNumber===!0)t=t.toNumber();else if(\"number\"!=typeof t)throw new TypeError(\"Parameter end must be a number\");if(null!=r)if(r.isBigNumber===!0)r=r.toNumber();else if(\"number\"!=typeof r)throw new TypeError(\"Parameter step must be a number\");this.start=null!=e?parseFloat(e):0,this.end=null!=t?parseFloat(t):0,this.step=null!=r?parseFloat(r):1}return a.prototype.type=\"Range\",a.prototype.isRange=!0,a.parse=function(e){if(\"string\"!=typeof e)return null;var t=e.split(\":\"),r=t.map(function(e){return parseFloat(e)}),n=r.some(function(e){return isNaN(e)});if(n)return null;switch(r.length){case 2:return new a(r[0],r[1]);case 3:return new a(r[0],r[2],r[1]);default:return null}},a.prototype.clone=function(){return new a(this.start,this.end,this.step)},a.prototype.size=function(){var e=0,t=this.start,r=this.step,n=this.end,a=n-t;return i.sign(r)==i.sign(a)?e=Math.ceil(a/r):0==a&&(e=0),isNaN(e)&&(e=0),[e]},a.prototype.min=function(){var e=this.size()[0];return e>0?this.step>0?this.start:this.start+(e-1)*this.step:void 0},a.prototype.max=function(){var e=this.size()[0];return e>0?this.step>0?this.start+(e-1)*this.step:this.start:void 0},a.prototype.forEach=function(e){var t=this.start,r=this.step,n=this.end,i=0;if(r>0)for(;n>t;)e(t,[i],this),t+=r,i++;else if(0>r)for(;t>n;)e(t,[i],this),t+=r,i++},a.prototype.map=function(e){var t=[];return this.forEach(function(r,n,i){t[n[0]]=e(r,n,i)}),t},a.prototype.toArray=function(){var e=[];return this.forEach(function(t,r){e[r[0]]=t}),e},a.prototype.valueOf=function(){return this.toArray()},a.prototype.format=function(e){var t=i.format(this.start,e);return 1!=this.step&&(t+=\":\"+i.format(this.step,e)),t+=\":\"+i.format(this.end,e)},a.prototype.toString=function(){return this.format()},a.prototype.toJSON=function(){return{mathjs:\"Range\",start:this.start,end:this.end,step:this.step}},a.fromJSON=function(e){return new a(e.start,e.end,e.step)},a}var i=r(6);t.name=\"Range\",t.path=\"type\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){return n(\"index\",{\"...number | BigNumber | Range | Array | Matrix\":function(t){var r=t.map(function(e){return e&&e.isBigNumber===!0?e.toNumber():e&&(Array.isArray(e)||e.isMatrix===!0)?e.map(function(e){return e&&e.isBigNumber===!0?e.toNumber():e}):e}),n=new e.Index;return e.Index.apply(n,r),n}})}t.name=\"index\",t.factory=r},function(e,t){\"use strict\";function r(e,t,r,n){var i=e.SparseMatrix,a=n(\"sparse\",{\"\":function(){return new i([])},string:function(e){return new i([],e)},\"Array | Matrix\":function(e){return new i(e)},\"Array | Matrix, string\":function(e,t){return new i(e,t)}});return a.toTex={0:\"\\\\begin{bsparse}\\\\end{bsparse}\",1:\"\\\\left(${args[0]}\\\\right)\"},a}t.name=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"number\",{\"\":function(){return 0},number:function(e){return e},string:function(e){var t=Number(e);if(isNaN(t))throw new SyntaxError('String \"'+e+'\" is no valid number');return t},BigNumber:function(e){return e.toNumber()},Unit:function(e){throw new Error(\"Second argument with valueless unit expected\")},\"Unit, string | Unit\":function(e,t){return e.toNumber(t)},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex={0:\"0\",1:\"\\\\left(${args[0]}\\\\right)\",2:\"\\\\left(\\\\left(${args[0]}\\\\right)${args[1]}\\\\right)\"},a}var i=r(19);t.name=\"number\",t.factory=n},function(e,t,r){e.exports=[r(71)]},function(e,t){\"use strict\";function r(e,t,r,n){function i(e){if(!(this instanceof i))throw new SyntaxError(\"Constructor must be called with the new operator\");this.entries=e||[]}return i.prototype.type=\"ResultSet\",i.prototype.isResultSet=!0,i.prototype.valueOf=function(){return this.entries},i.prototype.toString=function(){return\"[\"+this.entries.join(\", \")+\"]\"},i.prototype.toJSON=function(){return{mathjs:\"ResultSet\",entries:this.entries}},i.fromJSON=function(e){return new i(e.entries)},i}t.name=\"ResultSet\",t.path=\"type\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"string\",{\"\":function(){return\"\"},number:a.format,\"null\":function(e){return\"null\"},\"boolean\":function(e){return e+\"\"},string:function(e){return e},\"Array | Matrix\":function(e){return i(e,o)},any:function(e){return String(e)}});return o.toTex={0:'\\\\mathtt{\"\"}',1:\"\\\\mathrm{string}\\\\left(${args[0]}\\\\right)\"},o}var i=r(19),a=r(6);t.name=\"string\",t.factory=n},function(e,t,r){e.exports=[r(28),r(74),r(75)]},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"unit\",{Unit:function(e){return e.clone()},string:function(t){return e.Unit.isValuelessUnit(t)?new e.Unit(null,t):e.Unit.parse(t)},\"number, string\":function(t,r){return new e.Unit(t,r)},\"BigNumber, string\":function(t,r){return new e.Unit(t.toNumber(),r)},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex={1:\"\\\\left(${args[0]}\\\\right)\",2:\"\\\\left(\\\\left(${args[0]}\\\\right)${args[1]}\\\\right)\"},a}var i=r(19);t.name=\"unit\",t.factory=n},function(e,t,r){function n(e,t,r,n,a){function o(t){var r=e.Unit.parse(t);return r.fixPrefix=!0,r}i(a,\"speedOfLight\",function(){return o(\"299792458 m s^-1\")}),i(a,\"gravitationConstant\",function(){return o(\"6.6738480e-11 m^3 kg^-1 s^-2\")}),i(a,\"planckConstant\",function(){return o(\"6.626069311e-34 J s\")}),i(a,\"reducedPlanckConstant\",function(){return o(\"1.05457172647e-34 J s\")}),i(a,\"magneticConstant\",function(){return o(\"1.2566370614e-6 N A^-2\")}),i(a,\"electricConstant\",function(){return o(\"8.854187817e-12 F m^-1\")}),i(a,\"vacuumImpedance\",function(){return o(\"376.730313461 ohm\")}),i(a,\"coulomb\",function(){return o(\"8.9875517873681764e9 N m^2 C^-2\")}),i(a,\"elementaryCharge\",function(){return o(\"1.60217656535e-19 C\")}),i(a,\"bohrMagneton\",function(){return o(\"9.2740096820e-24 J T^-1\")}),i(a,\"conductanceQuantum\",function(){return o(\"7.748091734625e-5 S\")}),i(a,\"inverseConductanceQuantum\",function(){return o(\"12906.403721742 ohm\")}),i(a,\"magneticFluxQuantum\",function(){return o(\"2.06783375846e-15 Wb\")}),i(a,\"nuclearMagneton\",function(){return o(\"5.0507835311e-27 J T^-1\")}),i(a,\"klitzing\",function(){return o(\"25812.807443484 ohm\")}),i(a,\"bohrRadius\",function(){return o(\"5.291772109217e-11 m\")}),i(a,\"classicalElectronRadius\",function(){return o(\"2.817940326727e-15 m\")}),i(a,\"electronMass\",function(){return o(\"9.1093829140e-31 kg\")}),i(a,\"fermiCoupling\",function(){return o(\"1.1663645e-5 GeV^-2\")}),i(a,\"fineStructure\",function(){return.007297352569824}),i(a,\"hartreeEnergy\",function(){return o(\"4.3597443419e-18 J\")}),i(a,\"protonMass\",function(){return o(\"1.67262177774e-27 kg\")}),i(a,\"deuteronMass\",function(){return o(\"3.3435830926e-27 kg\")}),i(a,\"neutronMass\",function(){return o(\"1.6749271613e-27 kg\")}),i(a,\"quantumOfCirculation\",function(){return o(\"3.636947552024e-4 m^2 s^-1\")}),i(a,\"rydberg\",function(){return o(\"10973731.56853955 m^-1\")}),i(a,\"thomsonCrossSection\",function(){return o(\"6.65245873413e-29 m^2\")}),i(a,\"weakMixingAngle\",function(){return.222321}),i(a,\"efimovFactor\",function(){return 22.7}),i(a,\"atomicMass\",function(){return o(\"1.66053892173e-27 kg\")}),i(a,\"avogadro\",function(){return o(\"6.0221412927e23 mol^-1\")}),i(a,\"boltzmann\",function(){return o(\"1.380648813e-23 J K^-1\")}),i(a,\"faraday\",function(){return o(\"96485.336521 C mol^-1\")}),i(a,\"firstRadiation\",function(){return o(\"3.7417715317e-16 W m^2\")}),i(a,\"loschmidt\",function(){return o(\"2.686780524e25 m^-3\")}),i(a,\"gasConstant\",function(){return o(\"8.314462175 J K^-1 mol^-1\")}),i(a,\"molarPlanckConstant\",function(){return o(\"3.990312717628e-10 J s mol^-1\")}),i(a,\"molarVolume\",function(){return o(\"2.241396820e-10 m^3 mol^-1\")}),i(a,\"sackurTetrode\",function(){return-1.164870823}),i(a,\"secondRadiation\",function(){return o(\"1.438777013e-2 m K\")}),i(a,\"stefanBoltzmann\",function(){return o(\"5.67037321e-8 W m^-2 K^-4\")}),i(a,\"wienDisplacement\",function(){return o(\"2.897772126e-3 m K\")}),i(a,\"molarMass\",function(){return o(\"1e-3 kg mol^-1\")}),i(a,\"molarMassC12\",function(){return o(\"1.2e-2 kg mol^-1\")}),i(a,\"gravity\",function(){return o(\"9.80665 m s^-2\")}),i(a,\"planckLength\",function(){return o(\"1.61619997e-35 m\")}),i(a,\"planckMass\",function(){return o(\"2.1765113e-8 kg\")}),i(a,\"planckTime\",function(){return o(\"5.3910632e-44 s\")}),i(a,\"planckCharge\",function(){return o(\"1.87554595641e-18 C\")}),i(a,\"planckTemperature\",function(){return o(\"1.41683385e+32 K\")})}var i=r(3).lazy;t.factory=n,t.lazy=!1,t.math=!0},function(e,t,r){\"use strict\";function n(e,t,o,s,u){u.on(\"config\",function(r,i){r.number!==i.number&&n(e,t,o,s,u)}),u[\"true\"]=!0,u[\"false\"]=!1,u[\"null\"]=null,u.uninitialized=r(40).UNINITIALIZED,\"bignumber\"===t.number?(u.Infinity=new e.BigNumber(1/0),u.NaN=new e.BigNumber(NaN),i.lazy(u,\"pi\",function(){return a.pi(e.BigNumber)}),i.lazy(u,\"tau\",function(){return a.tau(e.BigNumber)}),i.lazy(u,\"e\",function(){return a.e(e.BigNumber)}),i.lazy(u,\"phi\",function(){return a.phi(e.BigNumber)}),i.lazy(u,\"E\",function(){return u.e}),i.lazy(u,\"LN2\",function(){return new e.BigNumber(2).ln()}),i.lazy(u,\"LN10\",function(){return new e.BigNumber(10).ln()}),i.lazy(u,\"LOG2E\",function(){return new e.BigNumber(1).div(new e.BigNumber(2).ln())}),i.lazy(u,\"LOG10E\",function(){return new e.BigNumber(1).div(new e.BigNumber(10).ln())}),i.lazy(u,\"PI\",function(){return u.pi}),i.lazy(u,\"SQRT1_2\",function(){return new e.BigNumber(\"0.5\").sqrt()}),i.lazy(u,\"SQRT2\",function(){return new e.BigNumber(2).sqrt()})):(u.Infinity=1/0,u.NaN=NaN,u.pi=Math.PI,u.tau=2*Math.PI,u.e=Math.E,u.phi=1.618033988749895,u.E=u.e,u.LN2=Math.LN2,u.LN10=Math.LN10,u.LOG2E=Math.LOG2E,u.LOG10E=Math.LOG10E,u.PI=u.pi,u.SQRT1_2=Math.SQRT1_2,u.SQRT2=Math.SQRT2),u.i=new e.Complex(0,1),u.version=r(79)}var i=r(3),a=r(77);t.factory=n,t.lazy=!1,t.math=!0},function(e,t,r){function n(e){return e[0].precision}var i=r(45).memoize,a=r(78);t.e=i(function(e){return new e(1).exp()},n),t.phi=i(function(e){return new e(1).plus(new e(5).sqrt()).div(2)},n),t.pi=i(function(e){var t=e.constructor({precision:e.precision+4}),r=new t(4).times(a(new t(1).div(5))).minus(a(new t(1).div(239)));return new e(4).times(r)},n),t.tau=i(function(e){var r=t.pi(e.constructor({precision:e.precision+2}));return new e(2).times(r)},n)},function(e,t){e.exports=function(e){for(var t=e,r=NaN,n=e.times(e),i=e,a=!0,o=3;!t.equals(r);o+=2)i=i.times(n),r=t,a=!a,t=a?t.plus(i.div(o)):t.minus(i.div(o));return t}},function(e,t){e.exports=\"2.4.1\"},function(e,t,r){e.exports=[r(81),r(251),r(275),r(276),r(311),r(253),r(274)]},function(e,t,r){function n(e,t,n,i){var a={};return a.bignumber=r(82),a[\"boolean\"]=r(83),a.complex=r(84),a.fraction=r(85),a.index=r(86),a.matrix=r(87),a.number=r(88),a.sparse=r(89),a.string=r(90),a.unit=r(91),a.e=r(92),a.E=r(92),a[\"false\"]=r(93),a.i=r(94),a.Infinity=r(95),a.LN2=r(96),a.LN10=r(97),a.LOG2E=r(98),a.LOG10E=r(99),a.NaN=r(100),a[\"null\"]=r(101),a.pi=r(102),a.PI=r(102),a.phi=r(103),a.SQRT1_2=r(104),a.SQRT2=r(105),a.tau=r(106),a[\"true\"]=r(107),a.version=r(108),a.speedOfLight={description:\"Speed of light in vacuum\",examples:[\"speedOfLight\"]},a.gravitationConstant={description:\"Newtonian constant of gravitation\",examples:[\"gravitationConstant\"]},a.planckConstant={description:\"Planck constant\",examples:[\"planckConstant\"]},a.reducedPlanckConstant={description:\"Reduced Planck constant\",examples:[\"reducedPlanckConstant\"]},a.magneticConstant={description:\"Magnetic constant (vacuum permeability)\",examples:[\"magneticConstant\"]},a.electricConstant={description:\"Electric constant (vacuum permeability)\",examples:[\"electricConstant\"]},a.vacuumImpedance={description:\"Characteristic impedance of vacuum\",examples:[\"vacuumImpedance\"]},a.coulomb={description:\"Coulomb's constant\",examples:[\"coulomb\"]},a.elementaryCharge={description:\"Elementary charge\",examples:[\"elementaryCharge\"]},a.bohrMagneton={description:\"Borh magneton\",examples:[\"bohrMagneton\"]},a.conductanceQuantum={description:\"Conductance quantum\",examples:[\"conductanceQuantum\"]},a.inverseConductanceQuantum={description:\"Inverse conductance quantum\",examples:[\"inverseConductanceQuantum\"]},a.magneticFluxQuantum={description:\"Magnetic flux quantum\",examples:[\"magneticFluxQuantum\"]},a.nuclearMagneton={description:\"Nuclear magneton\",examples:[\"nuclearMagneton\"]},a.klitzing={description:\"Von Klitzing constant\",examples:[\"klitzing\"]},a.bohrRadius={description:\"Borh radius\",examples:[\"bohrRadius\"]},a.classicalElectronRadius={description:\"Classical electron radius\",examples:[\"classicalElectronRadius\"]},a.electronMass={description:\"Electron mass\",examples:[\"electronMass\"]},a.fermiCoupling={description:\"Fermi coupling constant\",examples:[\"fermiCoupling\"]},a.fineStructure={description:\"Fine-structure constant\",examples:[\"fineStructure\"]},a.hartreeEnergy={description:\"Hartree energy\",examples:[\"hartreeEnergy\"]},a.protonMass={description:\"Proton mass\",examples:[\"protonMass\"]},a.deuteronMass={description:\"Deuteron Mass\",examples:[\"deuteronMass\"]},a.neutronMass={description:\"Neutron mass\",examples:[\"neutronMass\"]},a.quantumOfCirculation={description:\"Quantum of circulation\",examples:[\"quantumOfCirculation\"]},a.rydberg={description:\"Rydberg constant\",examples:[\"rydberg\"]},a.thomsonCrossSection={description:\"Thomson cross section\",examples:[\"thomsonCrossSection\"]},a.weakMixingAngle={description:\"Weak mixing angle\",examples:[\"weakMixingAngle\"]},a.efimovFactor={description:\"Efimov factor\",examples:[\"efimovFactor\"]},a.atomicMass={description:\"Atomic mass constant\",examples:[\"atomicMass\"]},a.avogadro={description:\"Avogadro's number\",examples:[\"avogadro\"]},a.boltzmann={description:\"Boltzmann constant\",examples:[\"boltzmann\"]},a.faraday={description:\"Faraday constant\",examples:[\"faraday\"]},a.firstRadiation={description:\"First radiation constant\",examples:[\"firstRadiation\"]},a.loschmidt={description:\"Loschmidt constant at T=273.15 K and p=101.325 kPa\",examples:[\"loschmidt\"]},a.gasConstant={description:\"Gas constant\",examples:[\"gasConstant\"]},a.molarPlanckConstant={description:\"Molar Planck constant\",examples:[\"molarPlanckConstant\"]},a.molarVolume={description:\"Molar volume of an ideal gas at T=273.15 K and p=101.325 kPa\",examples:[\"molarVolume\"]},a.sackurTetrode={description:\"Sackur-Tetrode constant at T=1 K and p=101.325 kPa\",examples:[\"sackurTetrode\"]},a.secondRadiation={description:\"Second radiation constant\",examples:[\"secondRadiation\"]},a.stefanBoltzmann={description:\"Stefan-Boltzmann constant\",examples:[\"stefanBoltzmann\"]},a.wienDisplacement={description:\"Wien displacement law constant\",examples:[\"wienDisplacement\"]},a.molarMass={description:\"Molar mass constant\",examples:[\"molarMass\"]},a.molarMassC12={description:\"Molar mass constant of carbon-12\",examples:[\"molarMassC12\"]},a.gravity={description:\"Standard acceleration of gravity (standard acceleration of free-fall on Earth)\",examples:[\"gravity\"]},a.planckLength={description:\"Planck length\",examples:[\"planckLength\"]},a.planckMass={description:\"Planck mass\",examples:[\"planckMass\"]},a.planckTime={description:\"Planck time\",examples:[\"planckTime\"]},a.planckCharge={description:\"Planck charge\",examples:[\"planckCharge\"]},a.planckTemperature={description:\"Planck temperature\",examples:[\"planckTemperature\"]},a.lsolve=r(109),a.lup=r(110),a.lusolve=r(111),a.slu=r(112),a.usolve=r(113),a.abs=r(114),a.add=r(115),a.cbrt=r(116),a.ceil=r(117),a.cube=r(118),a.divide=r(119),a.dotDivide=r(120),a.dotMultiply=r(121),a.dotPow=r(122),a.exp=r(123),a.fix=r(124),a.floor=r(125),a.gcd=r(126),a.hypot=r(127),a.lcm=r(128),a.log=r(129),a.log10=r(130),a.mod=r(131),a.multiply=r(132),a.norm=r(133),a.nthRoot=r(134),a.pow=r(135),a.round=r(136),a.sign=r(137),a.sqrt=r(138),\na.square=r(139),a.subtract=r(140),a.unaryMinus=r(141),a.unaryPlus=r(142),a.xgcd=r(143),a.bitAnd=r(144),a.bitNot=r(145),a.bitOr=r(146),a.bitXor=r(147),a.leftShift=r(148),a.rightArithShift=r(149),a.rightLogShift=r(150),a.bellNumbers=r(151),a.catalan=r(152),a.composition=r(153),a.stirlingS2=r(154),a.arg=r(155),a.conj=r(156),a.re=r(157),a.im=r(158),a.eval=r(159),a.help=r(160),a.distance=r(161),a.intersect=r(162),a.and=r(163),a.not=r(164),a.or=r(165),a.xor=r(166),a.concat=r(167),a.cross=r(168),a.det=r(169),a.diag=r(170),a.dot=r(171),a.eye=r(172),a.flatten=r(173),a.inv=r(174),a.ones=r(175),a.range=r(176),a.resize=r(177),a.size=r(178),a.squeeze=r(179),a.subset=r(180),a.trace=r(181),a.transpose=r(182),a.zeros=r(183),a.combinations=r(184),a.factorial=r(185),a.gamma=r(186),a.kldivergence=r(187),a.multinomial=r(188),a.permutations=r(189),a.pickRandom=r(190),a.random=r(191),a.randomInt=r(192),a.compare=r(193),a.deepEqual=r(194),a.equal=r(195),a.larger=r(196),a.largerEq=r(197),a.smaller=r(198),a.smallerEq=r(199),a.unequal=r(200),a.max=r(201),a.mean=r(202),a.median=r(203),a.min=r(204),a.mode=r(205),a.prod=r(206),a.quantileSeq=r(207),a.std=r(208),a.sum=r(209),a[\"var\"]=r(210),a.acos=r(211),a.acosh=r(212),a.acot=r(213),a.acoth=r(214),a.acsc=r(215),a.acsch=r(216),a.asec=r(217),a.asech=r(218),a.asin=r(219),a.asinh=r(220),a.atan=r(221),a.atanh=r(222),a.atan2=r(223),a.cos=r(224),a.cosh=r(225),a.cot=r(226),a.coth=r(227),a.csc=r(228),a.csch=r(229),a.sec=r(230),a.sech=r(231),a.sin=r(232),a.sinh=r(233),a.tan=r(234),a.tanh=r(235),a.to=r(236),a.clone=r(237),a.map=r(238),a.partitionSelect=r(239),a.filter=r(240),a.forEach=r(241),a.format=r(242),a.isInteger=r(243),a.isNegative=r(244),a.isNumeric=r(245),a.isPositive=r(246),a.isZero=r(247),a[\"import\"]=r(248),a.sort=r(249),a[\"typeof\"]=r(250),a}t.name=\"docs\",t.path=\"expression\",t.factory=n},function(e,t){e.exports={name:\"bignumber\",category:\"Type\",syntax:[\"bignumber(x)\"],description:\"Create a big number from a number or string.\",examples:[\"0.1 + 0.2\",\"bignumber(0.1) + bignumber(0.2)\",'bignumber(\"7.2\")','bignumber(\"7.2e500\")',\"bignumber([0.1, 0.2, 0.3])\"],seealso:[\"boolean\",\"complex\",\"fraction\",\"index\",\"matrix\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"boolean\",category:\"Type\",syntax:[\"x\",\"boolean(x)\"],description:\"Convert a string or number into a boolean.\",examples:[\"boolean(0)\",\"boolean(1)\",\"boolean(3)\",'boolean(\"true\")','boolean(\"false\")',\"boolean([1, 0, 1, 1])\"],seealso:[\"bignumber\",\"complex\",\"index\",\"matrix\",\"number\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"complex\",category:\"Type\",syntax:[\"complex()\",\"complex(re, im)\",\"complex(string)\"],description:\"Create a complex number.\",examples:[\"complex()\",\"complex(2, 3)\",'complex(\"7 - 2i\")'],seealso:[\"bignumber\",\"boolean\",\"index\",\"matrix\",\"number\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"fraction\",category:\"Type\",syntax:[\"fraction(num)\",\"fraction(num,den)\"],description:\"Create a fraction from a number or from a numerator and denominator.\",examples:[\"fraction(0.125)\",\"fraction(1, 3) + fraction(2, 5)\"],seealso:[\"bignumber\",\"boolean\",\"complex\",\"index\",\"matrix\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"index\",category:\"Type\",syntax:[\"[start]\",\"[start:end]\",\"[start:step:end]\",\"[start1, start 2, ...]\",\"[start1:end1, start2:end2, ...]\",\"[start1:step1:end1, start2:step2:end2, ...]\"],description:\"Create an index to get or replace a subset of a matrix\",examples:[\"[]\",\"[1, 2, 3]\",\"A = [1, 2, 3; 4, 5, 6]\",\"A[1, :]\",\"A[1, 2] = 50\",\"A[0:2, 0:2] = ones(2, 2)\"],seealso:[\"bignumber\",\"boolean\",\"complex\",\"matrix,\",\"number\",\"range\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"matrix\",category:\"Type\",syntax:[\"[]\",\"[a1, b1, ...; a2, b2, ...]\",\"matrix()\",'matrix(\"dense\")',\"matrix([...])\"],description:\"Create a matrix.\",examples:[\"[]\",\"[1, 2, 3]\",\"[1, 2, 3; 4, 5, 6]\",\"matrix()\",\"matrix([3, 4])\",'matrix([3, 4; 5, 6], \"sparse\")','matrix([3, 4; 5, 6], \"sparse\", \"number\")'],seealso:[\"bignumber\",\"boolean\",\"complex\",\"index\",\"number\",\"string\",\"unit\",\"sparse\"]}},function(e,t){e.exports={name:\"number\",category:\"Type\",syntax:[\"x\",\"number(x)\"],description:\"Create a number or convert a string or boolean into a number.\",examples:[\"2\",\"2e3\",\"4.05\",\"number(2)\",'number(\"7.2\")',\"number(true)\",\"number([true, false, true, true])\",'number(\"52cm\", \"m\")'],seealso:[\"bignumber\",\"boolean\",\"complex\",\"fraction\",\"index\",\"matrix\",\"string\",\"unit\"]}},function(e,t){e.exports={name:\"sparse\",category:\"Type\",syntax:[\"sparse()\",\"sparse([a1, b1, ...; a1, b2, ...])\",'sparse([a1, b1, ...; a1, b2, ...], \"number\")'],description:\"Create a sparse matrix.\",examples:[\"sparse()\",\"sparse([3, 4; 5, 6])\",'sparse([3, 0; 5, 0], \"number\")'],seealso:[\"bignumber\",\"boolean\",\"complex\",\"index\",\"number\",\"string\",\"unit\",\"matrix\"]}},function(e,t){e.exports={name:\"string\",category:\"Type\",syntax:['\"text\"',\"string(x)\"],description:\"Create a string or convert a value to a string\",examples:['\"Hello World!\"',\"string(4.2)\",\"string(3 + 2i)\"],seealso:[\"bignumber\",\"boolean\",\"complex\",\"index\",\"matrix\",\"number\",\"unit\"]}},function(e,t){e.exports={name:\"unit\",category:\"Type\",syntax:[\"value unit\",\"unit(value, unit)\",\"unit(string)\"],description:\"Create a unit.\",examples:[\"5.5 mm\",\"3 inch\",'unit(7.1, \"kilogram\")','unit(\"23 deg\")'],seealso:[\"bignumber\",\"boolean\",\"complex\",\"index\",\"matrix\",\"number\",\"string\"]}},function(e,t){e.exports={name:\"e\",category:\"Constants\",syntax:[\"e\"],description:\"Euler's number, the base of the natural logarithm. Approximately equal to 2.71828\",examples:[\"e\",\"e ^ 2\",\"exp(2)\",\"log(e)\"],seealso:[\"exp\"]}},function(e,t){e.exports={name:\"false\",category:\"Constants\",syntax:[\"false\"],description:\"Boolean value false\",examples:[\"false\"],seealso:[\"true\"]}},function(e,t){e.exports={name:\"i\",category:\"Constants\",syntax:[\"i\"],description:\"Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.\",examples:[\"i\",\"i * i\",\"sqrt(-1)\"],seealso:[]}},function(e,t){e.exports={name:\"Infinity\",category:\"Constants\",syntax:[\"Infinity\"],description:\"Infinity, a number which is larger than the maximum number that can be handled by a floating point number.\",examples:[\"Infinity\",\"1 / 0\"],seealso:[]}},function(e,t){e.exports={name:\"LN2\",category:\"Constants\",syntax:[\"LN2\"],description:\"Returns the natural logarithm of 2, approximately equal to 0.693\",examples:[\"LN2\",\"log(2)\"],seealso:[]}},function(e,t){e.exports={name:\"LN10\",category:\"Constants\",syntax:[\"LN10\"],description:\"Returns the natural logarithm of 10, approximately equal to 2.302\",examples:[\"LN10\",\"log(10)\"],seealso:[]}},function(e,t){e.exports={name:\"LOG2E\",category:\"Constants\",syntax:[\"LOG2E\"],description:\"Returns the base-2 logarithm of E, approximately equal to 1.442\",examples:[\"LOG2E\",\"log(e, 2)\"],seealso:[]}},function(e,t){e.exports={name:\"LOG10E\",category:\"Constants\",syntax:[\"LOG10E\"],description:\"Returns the base-10 logarithm of E, approximately equal to 0.434\",examples:[\"LOG10E\",\"log(e, 10)\"],seealso:[]}},function(e,t){e.exports={name:\"NaN\",category:\"Constants\",syntax:[\"NaN\"],description:\"Not a number\",examples:[\"NaN\",\"0 / 0\"],seealso:[]}},function(e,t){e.exports={name:\"null\",category:\"Constants\",syntax:[\"null\"],description:\"Value null\",examples:[\"null\"],seealso:[\"true\",\"false\"]}},function(e,t){e.exports={name:\"pi\",category:\"Constants\",syntax:[\"pi\"],description:\"The number pi is a mathematical constant that is the ratio of a circle's circumference to its diameter, and is approximately equal to 3.14159\",examples:[\"pi\",\"sin(pi/2)\"],seealso:[\"tau\"]}},function(e,t){e.exports={name:\"phi\",category:\"Constants\",syntax:[\"phi\"],description:\"Phi is the golden ratio. Two quantities are in the golden ratio if their ratio is the same as the ratio of their sum to the larger of the two quantities. Phi is defined as `(1 + sqrt(5)) / 2` and is approximately 1.618034...\",examples:[\"tau\"],seealso:[]}},function(e,t){e.exports={name:\"SQRT1_2\",category:\"Constants\",syntax:[\"SQRT1_2\"],description:\"Returns the square root of 1/2, approximately equal to 0.707\",examples:[\"SQRT1_2\",\"sqrt(1/2)\"],seealso:[]}},function(e,t){e.exports={name:\"SQRT2\",category:\"Constants\",syntax:[\"SQRT2\"],description:\"Returns the square root of 2, approximately equal to 1.414\",examples:[\"SQRT2\",\"sqrt(2)\"],seealso:[]}},function(e,t){e.exports={name:\"tau\",category:\"Constants\",syntax:[\"tau\"],description:\"Tau is the ratio constant of a circle's circumference to radius, equal to 2 * pi, approximately 6.2832.\",examples:[\"tau\",\"2 * pi\"],seealso:[\"pi\"]}},function(e,t){e.exports={name:\"true\",category:\"Constants\",syntax:[\"true\"],description:\"Boolean value true\",examples:[\"true\"],seealso:[\"false\"]}},function(e,t){e.exports={name:\"version\",category:\"Constants\",syntax:[\"version\"],description:\"A string with the version number of math.js\",examples:[\"version\"],seealso:[]}},function(e,t){e.exports={name:\"lsolve\",category:\"Algebra\",syntax:[\"x=lsolve(L, b)\"],description:\"Solves the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.\",examples:[\"a = [-2, 3; 2, 1]\",\"b = [11, 9]\",\"x = lsolve(a, b)\"],seealso:[\"lup\",\"lusolve\",\"usolve\",\"matrix\",\"sparse\"]}},function(e,t){e.exports={name:\"lup\",category:\"Algebra\",syntax:[\"lup(m)\"],description:\"Calculate the Matrix LU decomposition with partial pivoting. Matrix A is decomposed in three matrices (L, U, P) where P * A = L * U\",examples:[\"lup([[2, 1], [1, 4]])\",\"lup(matrix([[2, 1], [1, 4]]))\",\"lup(sparse([[2, 1], [1, 4]]))\"],seealso:[\"lusolve\",\"lsolve\",\"usolve\",\"matrix\",\"sparse\",\"slu\"]}},function(e,t){e.exports={name:\"lusolve\",category:\"Algebra\",syntax:[\"x=lusolve(A, b)\",\"x=lusolve(lu, b)\"],description:\"Solves the linear system A * x = b where A is an [n x n] matrix and b is a [n] column vector.\",examples:[\"a = [-2, 3; 2, 1]\",\"b = [11, 9]\",\"x = lusolve(a, b)\"],seealso:[\"lup\",\"slu\",\"lsolve\",\"usolve\",\"matrix\",\"sparse\"]}},function(e,t){e.exports={name:\"slu\",category:\"Algebra\",syntax:[\"slu(A, order, threshold)\"],description:\"Calculate the Matrix LU decomposition with full pivoting. Matrix A is decomposed in two matrices (L, U) and two permutation vectors (pinv, q) where P * A * Q = L * U\",examples:[\"slu(sparse([4.5, 0, 3.2, 0; 3.1, 2.9, 0, 0.9; 0, 1.7, 3, 0; 3.5, 0.4, 0, 1]), 1, 0.001)\"],seealso:[\"lusolve\",\"lsolve\",\"usolve\",\"matrix\",\"sparse\",\"lup\"]}},function(e,t){e.exports={name:\"usolve\",category:\"Algebra\",syntax:[\"x=usolve(U, b)\"],description:\"Solves the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.\",examples:[\"x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])\"],seealso:[\"lup\",\"lusolve\",\"lsolve\",\"matrix\",\"sparse\"]}},function(e,t){e.exports={name:\"abs\",category:\"Arithmetic\",syntax:[\"abs(x)\"],description:\"Compute the absolute value.\",examples:[\"abs(3.5)\",\"abs(-4.2)\"],seealso:[\"sign\"]}},function(e,t){e.exports={name:\"add\",category:\"Operators\",syntax:[\"x + y\",\"add(x, y)\"],description:\"Add two values.\",examples:[\"a = 2.1 + 3.6\",\"a - 3.6\",\"3 + 2i\",\"3 cm + 2 inch\",'\"2.3\" + \"4\"'],seealso:[\"subtract\"]}},function(e,t){e.exports={name:\"cbrt\",category:\"Arithmetic\",syntax:[\"cbrt(x)\",\"cbrt(x, allRoots)\"],description:\"Compute the cubic root value. If x = y * y * y, then y is the cubic root of x. When `x` is a number or complex number, an optional second argument `allRoots` can be provided to return all three cubic roots. If not provided, the principal root is returned\",examples:[\"cbrt(64)\",\"cube(4)\",\"cbrt(-8)\",\"cbrt(2 + 3i)\",\"cbrt(8i)\",\"cbrt(8i, true)\",\"cbrt(27 m^3)\"],seealso:[\"square\",\"sqrt\",\"cube\",\"multiply\"]}},function(e,t){e.exports={name:\"ceil\",category:\"Arithmetic\",syntax:[\"ceil(x)\"],description:\"Round a value towards plus infinity. If x is complex, both real and imaginary part are rounded towards plus infinity.\",examples:[\"ceil(3.2)\",\"ceil(3.8)\",\"ceil(-4.2)\"],seealso:[\"floor\",\"fix\",\"round\"]}},function(e,t){e.exports={name:\"cube\",category:\"Arithmetic\",syntax:[\"cube(x)\"],description:\"Compute the cube of a value. The cube of x is x * x * x.\",examples:[\"cube(2)\",\"2^3\",\"2 * 2 * 2\"],seealso:[\"multiply\",\"square\",\"pow\"]}},function(e,t){e.exports={name:\"divide\",category:\"Operators\",syntax:[\"x / y\",\"divide(x, y)\"],description:\"Divide two values.\",examples:[\"a = 2 / 3\",\"a * 3\",\"4.5 / 2\",\"3 + 4 / 2\",\"(3 + 4) / 2\",\"18 km / 4.5\"],seealso:[\"multiply\"]}},function(e,t){e.exports={name:\"dotDivide\",category:\"Operators\",syntax:[\"x ./ y\",\"dotDivide(x, y)\"],description:\"Divide two values element wise.\",examples:[\"a = [1, 2, 3; 4, 5, 6]\",\"b = [2, 1, 1; 3, 2, 5]\",\"a ./ b\"],seealso:[\"multiply\",\"dotMultiply\",\"divide\"]}},function(e,t){e.exports={name:\"dotMultiply\",category:\"Operators\",syntax:[\"x .* y\",\"dotMultiply(x, y)\"],description:\"Multiply two values element wise.\",examples:[\"a = [1, 2, 3; 4, 5, 6]\",\"b = [2, 1, 1; 3, 2, 5]\",\"a .* b\"],seealso:[\"multiply\",\"divide\",\"dotDivide\"]}},function(e,t){e.exports={name:\"dotpow\",category:\"Operators\",syntax:[\"x .^ y\",\"dotpow(x, y)\"],description:\"Calculates the power of x to y element wise.\",examples:[\"a = [1, 2, 3; 4, 5, 6]\",\"a .^ 2\"],seealso:[\"pow\"]}},function(e,t){e.exports={name:\"exp\",category:\"Arithmetic\",syntax:[\"exp(x)\"],description:\"Calculate the exponent of a value.\",examples:[\"exp(1.3)\",\"e ^ 1.3\",\"log(exp(1.3))\",\"x = 2.4\",\"(exp(i*x) == cos(x) + i*sin(x))   # Euler's formula\"],seealso:[\"pow\",\"log\"]}},function(e,t){e.exports={name:\"fix\",category:\"Arithmetic\",syntax:[\"fix(x)\"],description:\"Round a value towards zero. If x is complex, both real and imaginary part are rounded towards zero.\",examples:[\"fix(3.2)\",\"fix(3.8)\",\"fix(-4.2)\",\"fix(-4.8)\"],seealso:[\"ceil\",\"floor\",\"round\"]}},function(e,t){e.exports={name:\"floor\",category:\"Arithmetic\",syntax:[\"floor(x)\"],description:\"Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.\",examples:[\"floor(3.2)\",\"floor(3.8)\",\"floor(-4.2)\"],seealso:[\"ceil\",\"fix\",\"round\"]}},function(e,t){e.exports={name:\"gcd\",category:\"Arithmetic\",syntax:[\"gcd(a, b)\",\"gcd(a, b, c, ...)\"],description:\"Compute the greatest common divisor.\",examples:[\"gcd(8, 12)\",\"gcd(-4, 6)\",\"gcd(25, 15, -10)\"],seealso:[\"lcm\",\"xgcd\"]}},function(e,t){e.exports={name:\"hypot\",category:\"Arithmetic\",syntax:[\"hypot(a, b, c, ...)\",\"hypot([a, b, c, ...])\"],description:\"Calculate the hypotenusa of a list with values. \",examples:[\"hypot(3, 4)\",\"sqrt(3^2 + 4^2)\",\"hypot(-2)\",\"hypot([3, 4, 5])\"],seealso:[\"abs\",\"norm\"]}},function(e,t){e.exports={name:\"lcm\",category:\"Arithmetic\",syntax:[\"lcm(x, y)\"],description:\"Compute the least common multiple.\",examples:[\"lcm(4, 6)\",\"lcm(6, 21)\",\"lcm(6, 21, 5)\"],seealso:[\"gcd\"]}},function(e,t){e.exports={name:\"log\",category:\"Arithmetic\",syntax:[\"log(x)\",\"log(x, base)\"],description:\"Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).\",examples:[\"log(3.5)\",\"a = log(2.4)\",\"exp(a)\",\"10 ^ 4\",\"log(10000, 10)\",\"log(10000) / log(10)\",\"b = log(1024, 2)\",\"2 ^ b\"],seealso:[\"exp\",\"log10\"]}},function(e,t){e.exports={name:\"log10\",category:\"Arithmetic\",syntax:[\"log10(x)\"],description:\"Compute the 10-base logarithm of a value.\",examples:[\"log10(0.00001)\",\"log10(10000)\",\"10 ^ 4\",\"log(10000) / log(10)\",\"log(10000, 10)\"],seealso:[\"exp\",\"log\"]}},function(e,t){e.exports={name:\"mod\",category:\"Operators\",syntax:[\"x % y\",\"x mod y\",\"mod(x, y)\"],description:\"Calculates the modulus, the remainder of an integer division.\",examples:[\"7 % 3\",\"11 % 2\",\"10 mod 4\",\"function isOdd(x) = x % 2\",\"isOdd(2)\",\"isOdd(3)\"],seealso:[\"divide\"]}},function(e,t){e.exports={name:\"multiply\",category:\"Operators\",syntax:[\"x * y\",\"multiply(x, y)\"],description:\"multiply two values.\",examples:[\"a = 2.1 * 3.4\",\"a / 3.4\",\"2 * 3 + 4\",\"2 * (3 + 4)\",\"3 * 2.1 km\"],seealso:[\"divide\"]}},function(e,t){e.exports={name:\"norm\",category:\"Arithmetic\",syntax:[\"norm(x)\",\"norm(x, p)\"],description:\"Calculate the norm of a number, vector or matrix.\",examples:[\"abs(-3.5)\",\"norm(-3.5)\",\"norm(3 - 4i))\",\"norm([1, 2, -3], Infinity)\",\"norm([1, 2, -3], -Infinity)\",\"norm([3, 4], 2)\",\"norm([[1, 2], [3, 4]], 1)\",\"norm([[1, 2], [3, 4]], 'inf')\",\"norm([[1, 2], [3, 4]], 'fro')\"]}},function(e,t){e.exports={name:\"nthRoot\",category:\"Arithmetic\",syntax:[\"nthRoot(a)\",\"nthRoot(a, root)\"],description:'Calculate the nth root of a value. The principal nth root of a positive real number A, is the positive real solution of the equation \"x^root = A\".',examples:[\"4 ^ 3\",\"nthRoot(64, 3)\",\"nthRoot(9, 2)\",\"sqrt(9)\"],seealso:[\"sqrt\",\"pow\"]}},function(e,t){e.exports={name:\"pow\",category:\"Operators\",syntax:[\"x ^ y\",\"pow(x, y)\"],description:\"Calculates the power of x to y, x^y.\",examples:[\"2^3 = 8\",\"2*2*2\",\"1 + e ^ (pi * i)\"],seealso:[\"multiply\"]}},function(e,t){e.exports={name:\"round\",category:\"Arithmetic\",syntax:[\"round(x)\",\"round(x, n)\"],description:\"round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.\",examples:[\"round(3.2)\",\"round(3.8)\",\"round(-4.2)\",\"round(-4.8)\",\"round(pi, 3)\",\"round(123.45678, 2)\"],seealso:[\"ceil\",\"floor\",\"fix\"]}},function(e,t){e.exports={name:\"sign\",category:\"Arithmetic\",syntax:[\"sign(x)\"],description:\"Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.\",examples:[\"sign(3.5)\",\"sign(-4.2)\",\"sign(0)\"],seealso:[\"abs\"]}},function(e,t){e.exports={name:\"sqrt\",category:\"Arithmetic\",syntax:[\"sqrt(x)\"],description:\"Compute the square root value. If x = y * y, then y is the square root of x.\",examples:[\"sqrt(25)\",\"5 * 5\",\"sqrt(-1)\"],seealso:[\"square\",\"multiply\"]}},function(e,t){e.exports={name:\"square\",category:\"Arithmetic\",syntax:[\"square(x)\"],description:\"Compute the square of a value. The square of x is x * x.\",examples:[\"square(3)\",\"sqrt(9)\",\"3^2\",\"3 * 3\"],seealso:[\"multiply\",\"pow\",\"sqrt\",\"cube\"]}},function(e,t){e.exports={name:\"subtract\",category:\"Operators\",syntax:[\"x - y\",\"subtract(x, y)\"],description:\"subtract two values.\",examples:[\"a = 5.3 - 2\",\"a + 2\",\"2/3 - 1/6\",\"2 * 3 - 3\",\"2.1 km - 500m\"],seealso:[\"add\"]}},function(e,t){e.exports={name:\"unaryMinus\",category:\"Operators\",syntax:[\"-x\",\"unaryMinus(x)\"],description:\"Inverse the sign of a value. Converts booleans and strings to numbers.\",examples:[\"-4.5\",\"-(-5.6)\",'-\"22\"'],seealso:[\"add\",\"subtract\",\"unaryPlus\"]}},function(e,t){e.exports={name:\"unaryPlus\",category:\"Operators\",syntax:[\"+x\",\"unaryPlus(x)\"],description:\"Converts booleans and strings to numbers.\",examples:[\"+true\",'+\"2\"'],seealso:[\"add\",\"subtract\",\"unaryMinus\"]}},function(e,t){e.exports={name:\"xgcd\",category:\"Arithmetic\",syntax:[\"xgcd(a, b)\"],description:\"Calculate the extended greatest common divisor for two values\",examples:[\"xgcd(8, 12)\",\"gcd(8, 12)\",\"xgcd(36163, 21199)\"],seealso:[\"gcd\",\"lcm\"]}},function(e,t){e.exports={name:\"bitAnd\",category:\"Bitwise\",syntax:[\"x & y\",\"bitAnd(x, y)\"],description:\"Bitwise AND operation. Performs the logical AND operation on each pair of the corresponding bits of the two given values by multiplying them. If both bits in the compared position are 1, the bit in the resulting binary representation is 1, otherwise, the result is 0\",examples:[\"5 & 3\",\"bitAnd(53, 131)\",\"[1, 12, 31] & 42\"],seealso:[\"bitNot\",\"bitOr\",\"bitXor\",\"leftShift\",\"rightArithShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"bitNot\",category:\"Bitwise\",syntax:[\"~x\",\"bitNot(x)\"],description:\"Bitwise NOT operation. Performs a logical negation on each bit of the given value. Bits that are 0 become 1, and those that are 1 become 0.\",examples:[\"~1\",\"~2\",\"bitNot([2, -3, 4])\"],seealso:[\"bitAnd\",\"bitOr\",\"bitXor\",\"leftShift\",\"rightArithShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"bitOr\",category:\"Bitwise\",syntax:[\"x | y\",\"bitOr(x, y)\"],description:\"Bitwise OR operation. Performs the logical inclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if the first bit is 1 or the second bit is 1 or both bits are 1, otherwise, the result is 0.\",examples:[\"5 | 3\",\"bitOr([1, 2, 3], 4)\"],seealso:[\"bitAnd\",\"bitNot\",\"bitXor\",\"leftShift\",\"rightArithShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"bitXor\",category:\"Bitwise\",syntax:[\"bitXor(x, y)\"],description:\"Bitwise XOR operation, exclusive OR. Performs the logical exclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1.\",examples:[\"bitOr(1, 2)\",\"bitXor([2, 3, 4], 4)\"],seealso:[\"bitAnd\",\"bitNot\",\"bitOr\",\"leftShift\",\"rightArithShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"leftShift\",category:\"Bitwise\",syntax:[\"x << y\",\"leftShift(x, y)\"],description:\"Bitwise left logical shift of a value x by y number of bits.\",examples:[\"4 << 1\",\"8 >> 1\"],seealso:[\"bitAnd\",\"bitNot\",\"bitOr\",\"bitXor\",\"rightArithShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"rightArithShift\",category:\"Bitwise\",syntax:[\"x >> y\",\"leftShift(x, y)\"],description:\"Bitwise right arithmetic shift of a value x by y number of bits.\",examples:[\"8 >> 1\",\"4 << 1\",\"-12 >> 2\"],seealso:[\"bitAnd\",\"bitNot\",\"bitOr\",\"bitXor\",\"leftShift\",\"rightLogShift\"]}},function(e,t){e.exports={name:\"rightLogShift\",category:\"Bitwise\",syntax:[\"x >> y\",\"leftShift(x, y)\"],description:\"Bitwise right logical shift of a value x by y number of bits.\",examples:[\"8 >>> 1\",\"4 << 1\",\"-12 >>> 2\"],seealso:[\"bitAnd\",\"bitNot\",\"bitOr\",\"bitXor\",\"leftShift\",\"rightArithShift\"]}},function(e,t){e.exports={name:\"bellNumbers\",category:\"Combinatorics\",syntax:[\"bellNumbers(n)\"],description:\"The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S. `bellNumbers` only takes integer arguments. The following condition must be enforced: n >= 0.\",examples:[\"bellNumbers(3)\",\"bellNumbers(8)\"],seealso:[\"stirlingS2\"]}},function(e,t){e.exports={name:\"catalan\",category:\"Combinatorics\",syntax:[\"catalan(n)\"],description:\"The Catalan Numbers enumerate combinatorial structures of many different types. catalan only takes integer arguments. The following condition must be enforced: n >= 0.\",examples:[\"catalan(3)\",\"catalan(8)\"],seealso:[\"bellNumbers\"]}},function(e,t){e.exports={name:\"composition\",category:\"Combinatorics\",syntax:[\"composition(n, k)\"],description:\"The composition counts of n into k parts. composition only takes integer arguments. The following condition must be enforced: k <= n.\",examples:[\"composition(5, 3)\"],seealso:[\"combinations\"]}},function(e,t){e.exports={name:\"stirlingS2\",category:\"Combinatorics\",syntax:[\"stirlingS2(n, k)\"],description:\"he Stirling numbers of the second kind, counts the number of ways to partition a set of n labelled objects into k nonempty unlabelled subsets. `stirlingS2` only takes integer arguments. The following condition must be enforced: k <= n. If n = k or k = 1, then s(n,k) = 1.\",examples:[\"stirlingS2(5, 3)\"],seealso:[\"bellNumbers\"]}},function(e,t){e.exports={name:\"arg\",category:\"Complex\",syntax:[\"arg(x)\"],description:\"Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).\",examples:[\"arg(2 + 2i)\",\"atan2(3, 2)\",\"arg(2 + 3i)\"],seealso:[\"re\",\"im\",\"conj\",\"abs\"]}},function(e,t){e.exports={name:\"conj\",category:\"Complex\",syntax:[\"conj(x)\"],description:\"Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.\",examples:[\"conj(2 + 3i)\",\"conj(2 - 3i)\",\"conj(-5.2i)\"],seealso:[\"re\",\"im\",\"abs\",\"arg\"]}},function(e,t){e.exports={name:\"re\",category:\"Complex\",syntax:[\"re(x)\"],description:\"Get the real part of a complex number.\",examples:[\"re(2 + 3i)\",\"im(2 + 3i)\",\"re(-5.2i)\",\"re(2.4)\"],seealso:[\"im\",\"conj\",\"abs\",\"arg\"]}},function(e,t){e.exports={name:\"im\",category:\"Complex\",syntax:[\"im(x)\"],description:\"Get the imaginary part of a complex number.\",examples:[\"im(2 + 3i)\",\"re(2 + 3i)\",\"im(-5.2i)\",\"im(2.4)\"],seealso:[\"re\",\"conj\",\"abs\",\"arg\"]}},function(e,t){e.exports={name:\"eval\",category:\"Expression\",syntax:[\"eval(expression)\",\"eval([expr1, expr2, expr3, ...])\"],description:\"Evaluate an expression or an array with expressions.\",examples:['eval(\"2 + 3\")','eval(\"sqrt(\" + 4 + \")\")'],seealso:[]}},function(e,t){e.exports={name:\"help\",category:\"Expression\",syntax:[\"help(object)\",\"help(string)\"],description:\"Display documentation on a function or data type.\",examples:[\"help(sqrt)\",'help(\"complex\")'],seealso:[]}},function(e,t){e.exports={name:\"distance\",category:\"Geometry\",syntax:[\"distance([x1, y1], [x2, y2])\",\"distance([[x1, y1], [x2, y2])\"],description:\"Calculates the Euclidean distance between two points.\",examples:[\"distance([0,0], [4,4])\",\"distance([[0,0], [4,4]])\"],seealso:[]}},function(e,t){e.exports={name:\"intersect\",category:\"Geometry\",syntax:[\"intersect(expr1, expr2, expr3, expr4)\",\"intersect(expr1, expr2, expr3)\"],description:\"Computes the intersection point of lines and/or planes.\",examples:[\"intersect([0, 0], [10, 10], [10, 0], [0, 10])\",\"intersect([1, 0, 1],  [4, -2, 2], [1, 1, 1, 6])\"],seealso:[]}},function(e,t){e.exports={name:\"and\",category:\"Logical\",syntax:[\"x and y\",\"and(x, y)\"],description:\"Logical and. Test whether two values are both defined with a nonzero/nonempty value.\",examples:[\"true and false\",\"true and true\",\"2 and 4\"],seealso:[\"not\",\"or\",\"xor\"]}},function(e,t){e.exports={name:\"not\",category:\"Logical\",syntax:[\"not x\",\"not(x)\"],description:\"Logical not. Flips the boolean value of given argument.\",examples:[\"not true\",\"not false\",\"not 2\",\"not 0\"],seealso:[\"and\",\"or\",\"xor\"]}},function(e,t){e.exports={name:\"or\",category:\"Logical\",syntax:[\"x or y\",\"or(x, y)\"],description:\"Logical or. Test if at least one value is defined with a nonzero/nonempty value.\",examples:[\"true or false\",\"false or false\",\"0 or 4\"],seealso:[\"not\",\"and\",\"xor\"]}},function(e,t){e.exports={name:\"xor\",category:\"Logical\",syntax:[\"x or y\",\"or(x, y)\"],description:\"Logical exclusive or, xor. Test whether one and only one value is defined with a nonzero/nonempty value.\",examples:[\"true xor false\",\"false xor false\",\"true xor true\",\"0 or 4\"],seealso:[\"not\",\"and\",\"or\"]}},function(e,t){e.exports={name:\"concat\",category:\"Matrix\",syntax:[\"concat(A, B, C, ...)\",\"concat(A, B, C, ..., dim)\"],description:\"Concatenate matrices. By default, the matrices are concatenated by the last dimension. The dimension on which to concatenate can be provided as last argument.\",examples:[\"A = [1, 2; 5, 6]\",\"B = [3, 4; 7, 8]\",\"concat(A, B)\",\"concat(A, B, 1)\",\"concat(A, B, 2)\"],seealso:[\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"cross\",category:\"Matrix\",syntax:[\"cross(A, B)\"],description:\"Calculate the cross product for two vectors in three dimensional space.\",examples:[\"cross([1, 1, 0],  [0, 1, 1])\",\"cross([3, -3, 1], [4, 9, 2])\",\"cross([2, 3, 4],  [5, 6, 7])\"],seealso:[\"multiply\",\"dot\"]}},function(e,t){e.exports={name:\"det\",category:\"Matrix\",syntax:[\"det(x)\"],description:\"Calculate the determinant of a matrix\",examples:[\"det([1, 2; 3, 4])\",\"det([-2, 2, 3; -1, 1, 3; 2, 0, -1])\"],seealso:[\"concat\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"diag\",category:\"Matrix\",syntax:[\"diag(x)\",\"diag(x, k)\"],description:\"Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned. When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.\",examples:[\"diag(1:3)\",\"diag(1:3, 1)\",\"a = [1, 2, 3; 4, 5, 6; 7, 8, 9]\",\"diag(a)\"],seealso:[\"concat\",\"det\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"dot\",category:\"Matrix\",syntax:[\"dot(A, B)\"],description:\"Calculate the dot product of two vectors. The dot product of A = [a1, a2, a3, ..., an] and B = [b1, b2, b3, ..., bn] is defined as dot(A, B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn\",examples:[\"dot([2, 4, 1], [2, 2, 3])\",\"[2, 4, 1] * [2, 2, 3]\"],seealso:[\"multiply\",\"cross\"]}},function(e,t){e.exports={name:\"eye\",category:\"Matrix\",syntax:[\"eye(n)\",\"eye(m, n)\",\"eye([m, n])\",\"eye\"],description:\"Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.\",examples:[\"eye(3)\",\"eye(3, 5)\",\"a = [1, 2, 3; 4, 5, 6]\",\"eye(size(a))\"],seealso:[\"concat\",\"det\",\"diag\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"flatten\",category:\"Matrix\",syntax:[\"flatten(x)\"],description:\"Flatten a multi dimensional matrix into a single dimensional matrix.\",examples:[\"a = [1, 2, 3; 4, 5, 6]\",\"size(a)\",\"b = flatten(a)\",\"size(b)\"],seealso:[\"concat\",\"resize\",\"size\",\"squeeze\"]}},function(e,t){e.exports={name:\"inv\",category:\"Matrix\",syntax:[\"inv(x)\"],description:\"Calculate the inverse of a matrix\",examples:[\"inv([1, 2; 3, 4])\",\"inv(4)\",\"1 / 4\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"ones\",category:\"Matrix\",syntax:[\"ones(m)\",\"ones(m, n)\",\"ones(m, n, p, ...)\",\"ones([m])\",\"ones([m, n])\",\"ones([m, n, p, ...])\",\"ones\"],description:\"Create a matrix containing ones.\",examples:[\"ones(3)\",\"ones(3, 5)\",\"ones([2,3]) * 4.5\",\"a = [1, 2, 3; 4, 5, 6]\",\"ones(size(a))\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"range\",category:\"Type\",syntax:[\"start:end\",\"start:step:end\",\"range(start, end)\",\"range(start, end, step)\",\"range(string)\"],description:\"Create a range. Lower bound of the range is included, upper bound is excluded.\",examples:[\"1:5\",\"3:-1:-3\",\"range(3, 7)\",\"range(0, 12, 2)\",'range(\"4:10\")',\"a = [1, 2, 3, 4; 5, 6, 7, 8]\",\"a[1:2, 1:2]\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"resize\",category:\"Matrix\",syntax:[\"resize(x, size)\",\"resize(x, size, defaultValue)\"],description:\"Resize a matrix.\",examples:[\"resize([1,2,3,4,5], [3])\",\"resize([1,2,3], [5])\",\"resize([1,2,3], [5], -1)\",\"resize(2, [2, 3])\",'resize(\"hello\", [8], \"!\")'],seealso:[\"size\",\"subset\",\"squeeze\"]}},function(e,t){e.exports={name:\"size\",category:\"Matrix\",syntax:[\"size(x)\"],description:\"Calculate the size of a matrix.\",examples:[\"size(2.3)\",'size(\"hello world\")',\"a = [1, 2; 3, 4; 5, 6]\",\"size(a)\",\"size(1:6)\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"squeeze\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"squeeze\",category:\"Matrix\",syntax:[\"squeeze(x)\"],description:\"Remove inner and outer singleton dimensions from a matrix.\",examples:[\"a = zeros(3,2,1)\",\"size(squeeze(a))\",\"b = zeros(1,1,3)\",\"size(squeeze(b))\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"subset\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"subset\",category:\"Matrix\",syntax:[\"value(index)\",\"value(index) = replacement\",\"subset(value, [index])\",\"subset(value, [index], replacement)\"],description:\"Get or set a subset of a matrix or string. Indexes are one-based. Both the ranges lower-bound and upper-bound are included.\",examples:[\"d = [1, 2; 3, 4]\",\"e = []\",\"e[1, 1:2] = [5, 6]\",\"e[2, :] = [7, 8]\",\"f = d * e\",\"f[2, 1]\",\"f[:, 1]\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"trace\",\"transpose\",\"zeros\"]}},function(e,t){e.exports={name:\"trace\",category:\"Matrix\",syntax:[\"trace(A)\"],description:\"Calculate the trace of a matrix: the sum of the elements on the main diagonal of a square matrix.\",examples:[\"A = [1, 2, 3; -1, 2, 3; 2, 0, 3]\",\"trace(A)\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"transpose\",\"zeros\"]\n}},function(e,t){e.exports={name:\"transpose\",category:\"Matrix\",syntax:[\"x'\",\"transpose(x)\"],description:\"Transpose a matrix\",examples:[\"a = [1, 2, 3; 4, 5, 6]\",\"a'\",\"transpose(a)\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"zeros\"]}},function(e,t){e.exports={name:\"zeros\",category:\"Matrix\",syntax:[\"zeros(m)\",\"zeros(m, n)\",\"zeros(m, n, p, ...)\",\"zeros([m])\",\"zeros([m, n])\",\"zeros([m, n, p, ...])\",\"zeros\"],description:\"Create a matrix containing zeros.\",examples:[\"zeros(3)\",\"zeros(3, 5)\",\"a = [1, 2, 3; 4, 5, 6]\",\"zeros(size(a))\"],seealso:[\"concat\",\"det\",\"diag\",\"eye\",\"inv\",\"ones\",\"range\",\"size\",\"squeeze\",\"subset\",\"trace\",\"transpose\"]}},function(e,t){e.exports={name:\"combinations\",category:\"Probability\",syntax:[\"combinations(n, k)\"],description:\"Compute the number of combinations of n items taken k at a time\",examples:[\"combinations(7, 5)\"],seealso:[\"permutations\",\"factorial\"]}},function(e,t){e.exports={name:\"factorial\",category:\"Probability\",syntax:[\"kldivergence(x, y)\"],description:\"Compute the factorial of a value\",examples:[\"5!\",\"5 * 4 * 3 * 2 * 1\",\"3!\"],seealso:[\"combinations\",\"permutations\",\"gamma\"]}},function(e,t){e.exports={name:\"gamma\",category:\"Probability\",syntax:[\"gamma(n)\"],description:\"Compute the gamma function. For small values, the Lanczos approximation is used, and for large values the extended Stirling approximation.\",examples:[\"gamma(4)\",\"3!\",\"gamma(1/2)\",\"sqrt(pi)\"],seealso:[\"factorial\"]}},function(e,t){e.exports={name:\"kldivergence\",category:\"Probability\",syntax:[\"n!\",\"factorial(n)\"],description:\"Calculate the Kullback-Leibler (KL) divergence  between two distributions.\",examples:[\"math.kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5])\"],seealso:[]}},function(e,t){e.exports={name:\"multinomial\",category:\"Probability\",syntax:[\"multinomial(A)\"],description:\"Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities. multinomial takes one array of integers as an argument. The following condition must be enforced: every ai <= 0.\",examples:[\"multinomial([1, 2, 1])\"],seealso:[\"combinations\",\"factorial\"]}},function(e,t){e.exports={name:\"permutations\",category:\"Probability\",syntax:[\"permutations(n)\",\"permutations(n, k)\"],description:\"Compute the number of permutations of n items taken k at a time\",examples:[\"permutations(5)\",\"permutations(5, 3)\"],seealso:[\"combinations\",\"factorial\"]}},function(e,t){e.exports={name:\"pickRandom\",category:\"Probability\",syntax:[\"pickRandom(array)\"],description:\"Pick a random entry from a given array.\",examples:[\"pickRandom(0:10)\",\"pickRandom([1, 3, 1, 6])\"],seealso:[\"random\",\"randomInt\"]}},function(e,t){e.exports={name:\"random\",category:\"Probability\",syntax:[\"random()\",\"random(max)\",\"random(min, max)\",\"random(size)\",\"random(size, max)\",\"random(size, min, max)\"],description:\"Return a random number.\",examples:[\"random()\",\"random(10, 20)\",\"random([2, 3])\"],seealso:[\"pickRandom\",\"randomInt\"]}},function(e,t){e.exports={name:\"randInt\",category:\"Probability\",syntax:[\"randInt(max)\",\"randInt(min, max)\",\"randInt(size)\",\"randInt(size, max)\",\"randInt(size, min, max)\"],description:\"Return a random integer number\",examples:[\"randInt(10, 20)\",\"randInt([2, 3], 10)\"],seealso:[\"pickRandom\",\"random\"]}},function(e,t){e.exports={name:\"compare\",category:\"Relational\",syntax:[\"compare(x, y)\"],description:\"Compare two values. Returns 1 if x is larger than y, -1 if x is smaller than y, and 0 if x and y are equal.\",examples:[\"compare(2, 3)\",\"compare(3, 2)\",\"compare(2, 2)\",\"compare(5cm, 40mm)\",\"compare(2, [1, 2, 3])\"],seealso:[\"equal\",\"unequal\",\"smaller\",\"smallerEq\",\"largerEq\"]}},function(e,t){e.exports={name:\"deepEqual\",category:\"Relational\",syntax:[\"deepEqual(x, y)\"],description:\"Check equality of two matrices element wise. Returns true if the size of both matrices is equal and when and each of the elements are equal.\",examples:[\"[1,3,4] == [1,3,4]\",\"[1,3,4] == [1,3]\"],seealso:[\"equal\",\"unequal\",\"smaller\",\"larger\",\"smallerEq\",\"largerEq\",\"compare\"]}},function(e,t){e.exports={name:\"equal\",category:\"Relational\",syntax:[\"x == y\",\"equal(x, y)\"],description:\"Check equality of two values. Returns true if the values are equal, and false if not.\",examples:[\"2+2 == 3\",\"2+2 == 4\",\"a = 3.2\",\"b = 6-2.8\",\"a == b\",\"50cm == 0.5m\"],seealso:[\"unequal\",\"smaller\",\"larger\",\"smallerEq\",\"largerEq\",\"compare\",\"deepEqual\"]}},function(e,t){e.exports={name:\"larger\",category:\"Relational\",syntax:[\"x > y\",\"larger(x, y)\"],description:\"Check if value x is larger than y. Returns true if x is larger than y, and false if not.\",examples:[\"2 > 3\",\"5 > 2*2\",\"a = 3.3\",\"b = 6-2.8\",\"(a > b)\",\"(b < a)\",\"5 cm > 2 inch\"],seealso:[\"equal\",\"unequal\",\"smaller\",\"smallerEq\",\"largerEq\",\"compare\"]}},function(e,t){e.exports={name:\"largerEq\",category:\"Relational\",syntax:[\"x >= y\",\"largerEq(x, y)\"],description:\"Check if value x is larger or equal to y. Returns true if x is larger or equal to y, and false if not.\",examples:[\"2 > 1+1\",\"2 >= 1+1\",\"a = 3.2\",\"b = 6-2.8\",\"(a > b)\"],seealso:[\"equal\",\"unequal\",\"smallerEq\",\"smaller\",\"largerEq\",\"compare\"]}},function(e,t){e.exports={name:\"smaller\",category:\"Relational\",syntax:[\"x < y\",\"smaller(x, y)\"],description:\"Check if value x is smaller than value y. Returns true if x is smaller than y, and false if not.\",examples:[\"2 < 3\",\"5 < 2*2\",\"a = 3.3\",\"b = 6-2.8\",\"(a < b)\",\"5 cm < 2 inch\"],seealso:[\"equal\",\"unequal\",\"larger\",\"smallerEq\",\"largerEq\",\"compare\"]}},function(e,t){e.exports={name:\"smallerEq\",category:\"Relational\",syntax:[\"x <= y\",\"smallerEq(x, y)\"],description:\"Check if value x is smaller or equal to value y. Returns true if x is smaller than y, and false if not.\",examples:[\"2 < 1+1\",\"2 <= 1+1\",\"a = 3.2\",\"b = 6-2.8\",\"(a < b)\"],seealso:[\"equal\",\"unequal\",\"larger\",\"smaller\",\"largerEq\",\"compare\"]}},function(e,t){e.exports={name:\"unequal\",category:\"Relational\",syntax:[\"x != y\",\"unequal(x, y)\"],description:\"Check unequality of two values. Returns true if the values are unequal, and false if they are equal.\",examples:[\"2+2 != 3\",\"2+2 != 4\",\"a = 3.2\",\"b = 6-2.8\",\"a != b\",\"50cm != 0.5m\",\"5 cm != 2 inch\"],seealso:[\"equal\",\"smaller\",\"larger\",\"smallerEq\",\"largerEq\",\"compare\",\"deepEqual\"]}},function(e,t){e.exports={name:\"max\",category:\"Statistics\",syntax:[\"max(a, b, c, ...)\",\"max(A)\",\"max(A, dim)\"],description:\"Compute the maximum value of a list of values.\",examples:[\"max(2, 3, 4, 1)\",\"max([2, 3, 4, 1])\",\"max([2, 5; 4, 3])\",\"max([2, 5; 4, 3], 1)\",\"max([2, 5; 4, 3], 2)\",\"max(2.7, 7.1, -4.5, 2.0, 4.1)\",\"min(2.7, 7.1, -4.5, 2.0, 4.1)\"],seealso:[\"mean\",\"median\",\"min\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"mean\",category:\"Statistics\",syntax:[\"mean(a, b, c, ...)\",\"mean(A)\",\"mean(A, dim)\"],description:\"Compute the arithmetic mean of a list of values.\",examples:[\"mean(2, 3, 4, 1)\",\"mean([2, 3, 4, 1])\",\"mean([2, 5; 4, 3])\",\"mean([2, 5; 4, 3], 1)\",\"mean([2, 5; 4, 3], 2)\",\"mean([1.0, 2.7, 3.2, 4.0])\"],seealso:[\"max\",\"median\",\"min\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"median\",category:\"Statistics\",syntax:[\"median(a, b, c, ...)\",\"median(A)\"],description:\"Compute the median of all values. The values are sorted and the middle value is returned. In case of an even number of values, the average of the two middle values is returned.\",examples:[\"median(5, 2, 7)\",\"median([3, -1, 5, 7])\"],seealso:[\"max\",\"mean\",\"min\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"min\",category:\"Statistics\",syntax:[\"min(a, b, c, ...)\",\"min(A)\",\"min(A, dim)\"],description:\"Compute the minimum value of a list of values.\",examples:[\"min(2, 3, 4, 1)\",\"min([2, 3, 4, 1])\",\"min([2, 5; 4, 3])\",\"min([2, 5; 4, 3], 1)\",\"min([2, 5; 4, 3], 2)\",\"min(2.7, 7.1, -4.5, 2.0, 4.1)\",\"max(2.7, 7.1, -4.5, 2.0, 4.1)\"],seealso:[\"max\",\"mean\",\"median\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"mode\",category:\"Statistics\",syntax:[\"mode(a, b, c, ...)\",\"mode(A)\",\"mode(A, a, b, B, c, ...)\"],description:\"Computes the mode of all values as an array. In case mode being more than one, multiple values are returned in an array.\",examples:[\"mode(5, 2, 7)\",\"mode([3, -1, 5, 7])\"],seealso:[\"max\",\"mean\",\"min\",\"median\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"prod\",category:\"Statistics\",syntax:[\"prod(a, b, c, ...)\",\"prod(A)\"],description:\"Compute the product of all values.\",examples:[\"prod(2, 3, 4)\",\"prod([2, 3, 4])\",\"prod([2, 5; 4, 3])\"],seealso:[\"max\",\"mean\",\"min\",\"median\",\"min\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"quantileSeq\",category:\"Statistics\",syntax:[\"quantileSeq(A, prob[, sorted])\",\"quantileSeq(A, [prob1, prob2, ...][, sorted])\",\"quantileSeq(A, N[, sorted])\"],description:\"Compute the prob order quantile of a matrix or a list with values. The sequence is sorted and the middle value is returned. Supported types of sequence values are: Number, BigNumber, Unit Supported types of probablity are: Number, BigNumber. \\n\\nIn case of a (multi dimensional) array or matrix, the prob order quantile of all elements will be calculated.\",examples:[\"quantileSeq([3, -1, 5, 7], 0.5)\",\"quantileSeq([3, -1, 5, 7], [1/3, 2/3])\",\"quantileSeq([3, -1, 5, 7], 2)\",\"quantileSeq([-1, 3, 5, 7], 0.5, true)\"],seealso:[\"mean\",\"median\",\"min\",\"max\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"std\",category:\"Statistics\",syntax:[\"std(a, b, c, ...)\",\"std(A)\",\"std(A, normalization)\"],description:'Compute the standard deviation of all values, defined as std(A) = sqrt(var(A)). Optional parameter normalization can be \"unbiased\" (default), \"uncorrected\", or \"biased\".',examples:[\"std(2, 4, 6)\",\"std([2, 4, 6, 8])\",'std([2, 4, 6, 8], \"uncorrected\")','std([2, 4, 6, 8], \"biased\")',\"std([1, 2, 3; 4, 5, 6])\"],seealso:[\"max\",\"mean\",\"min\",\"median\",\"min\",\"prod\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"sum\",category:\"Statistics\",syntax:[\"sum(a, b, c, ...)\",\"sum(A)\"],description:\"Compute the sum of all values.\",examples:[\"sum(2, 3, 4, 1)\",\"sum([2, 3, 4, 1])\",\"sum([2, 5; 4, 3])\"],seealso:[\"max\",\"mean\",\"median\",\"min\",\"prod\",\"std\",\"sum\",\"var\"]}},function(e,t){e.exports={name:\"var\",category:\"Statistics\",syntax:[\"var(a, b, c, ...)\",\"var(A)\",\"var(A, normalization)\"],description:'Compute the variance of all values. Optional parameter normalization can be \"unbiased\" (default), \"uncorrected\", or \"biased\".',examples:[\"var(2, 4, 6)\",\"var([2, 4, 6, 8])\",'var([2, 4, 6, 8], \"uncorrected\")','var([2, 4, 6, 8], \"biased\")',\"var([1, 2, 3; 4, 5, 6])\"],seealso:[\"max\",\"mean\",\"min\",\"median\",\"min\",\"prod\",\"std\",\"sum\"]}},function(e,t){e.exports={name:\"acos\",category:\"Trigonometry\",syntax:[\"acos(x)\"],description:\"Compute the inverse cosine of a value in radians.\",examples:[\"acos(0.5)\",\"acos(cos(2.3))\"],seealso:[\"cos\",\"atan\",\"asin\"]}},function(e,t){e.exports={name:\"acosh\",category:\"Trigonometry\",syntax:[\"acosh(x)\"],description:\"Calculate the hyperbolic arccos of a value, defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`.\",examples:[\"acosh(1.5)\"],seealso:[\"cosh\",\"asinh\",\"atanh\"]}},function(e,t){e.exports={name:\"acot\",category:\"Trigonometry\",syntax:[\"acot(x)\"],description:\"Calculate the inverse cotangent of a value.\",examples:[\"acot(0.5)\",\"acot(cot(0.5))\",\"acot(2)\"],seealso:[\"cot\",\"atan\"]}},function(e,t){e.exports={name:\"acoth\",category:\"Trigonometry\",syntax:[\"acoth(x)\"],description:\"Calculate the hyperbolic arccotangent of a value, defined as `acoth(x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`.\",examples:[\"acoth(0.5)\"],seealso:[\"acsch\",\"asech\"]}},function(e,t){e.exports={name:\"acsc\",category:\"Trigonometry\",syntax:[\"acsc(x)\"],description:\"Calculate the inverse cotangent of a value.\",examples:[\"acsc(0.5)\",\"acsc(csc(0.5))\",\"acsc(2)\"],seealso:[\"csc\",\"asin\",\"asec\"]}},function(e,t){e.exports={name:\"acsch\",category:\"Trigonometry\",syntax:[\"acsch(x)\"],description:\"Calculate the hyperbolic arccosecant of a value, defined as `acsch(x) = ln(1/x + sqrt(1/x^2 + 1))`.\",examples:[\"acsch(0.5)\"],seealso:[\"asech\",\"acoth\"]}},function(e,t){e.exports={name:\"asec\",category:\"Trigonometry\",syntax:[\"asec(x)\"],description:\"Calculate the inverse secant of a value.\",examples:[\"asec(0.5)\",\"asec(sec(0.5))\",\"asec(2)\"],seealso:[\"acos\",\"acot\",\"acsc\"]}},function(e,t){e.exports={name:\"asech\",category:\"Trigonometry\",syntax:[\"asech(x)\"],description:\"Calculate the inverse secant of a value.\",examples:[\"asech(0.5)\"],seealso:[\"acsch\",\"acoth\"]}},function(e,t){e.exports={name:\"asin\",category:\"Trigonometry\",syntax:[\"asin(x)\"],description:\"Compute the inverse sine of a value in radians.\",examples:[\"asin(0.5)\",\"asin(sin(2.3))\"],seealso:[\"sin\",\"acos\",\"atan\"]}},function(e,t){e.exports={name:\"asinh\",category:\"Trigonometry\",syntax:[\"asinh(x)\"],description:\"Calculate the hyperbolic arcsine of a value, defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`.\",examples:[\"asinh(0.5)\"],seealso:[\"acosh\",\"atanh\"]}},function(e,t){e.exports={name:\"atan\",category:\"Trigonometry\",syntax:[\"atan(x)\"],description:\"Compute the inverse tangent of a value in radians.\",examples:[\"atan(0.5)\",\"atan(tan(2.3))\"],seealso:[\"tan\",\"acos\",\"asin\"]}},function(e,t){e.exports={name:\"atanh\",category:\"Trigonometry\",syntax:[\"atanh(x)\"],description:\"Calculate the hyperbolic arctangent of a value, defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`.\",examples:[\"atanh(0.5)\"],seealso:[\"acosh\",\"asinh\"]}},function(e,t){e.exports={name:\"atan2\",category:\"Trigonometry\",syntax:[\"atan2(y, x)\"],description:\"Computes the principal value of the arc tangent of y/x in radians.\",examples:[\"atan2(2, 2) / pi\",\"angle = 60 deg in rad\",\"x = cos(angle)\",\"y = sin(angle)\",\"atan2(y, x)\"],seealso:[\"sin\",\"cos\",\"tan\"]}},function(e,t){e.exports={name:\"cos\",category:\"Trigonometry\",syntax:[\"cos(x)\"],description:\"Compute the cosine of x in radians.\",examples:[\"cos(2)\",\"cos(pi / 4) ^ 2\",\"cos(180 deg)\",\"cos(60 deg)\",\"sin(0.2)^2 + cos(0.2)^2\"],seealso:[\"acos\",\"sin\",\"tan\"]}},function(e,t){e.exports={name:\"cosh\",category:\"Trigonometry\",syntax:[\"cosh(x)\"],description:\"Compute the hyperbolic cosine of x in radians.\",examples:[\"cosh(0.5)\"],seealso:[\"sinh\",\"tanh\",\"coth\"]}},function(e,t){e.exports={name:\"cot\",category:\"Trigonometry\",syntax:[\"cot(x)\"],description:\"Compute the cotangent of x in radians. Defined as 1/tan(x)\",examples:[\"cot(2)\",\"1 / tan(2)\"],seealso:[\"sec\",\"csc\",\"tan\"]}},function(e,t){e.exports={name:\"coth\",category:\"Trigonometry\",syntax:[\"coth(x)\"],description:\"Compute the hyperbolic cotangent of x in radians.\",examples:[\"coth(2)\",\"1 / tanh(2)\"],seealso:[\"sech\",\"csch\",\"tanh\"]}},function(e,t){e.exports={name:\"csc\",category:\"Trigonometry\",syntax:[\"csc(x)\"],description:\"Compute the cosecant of x in radians. Defined as 1/sin(x)\",examples:[\"csc(2)\",\"1 / sin(2)\"],seealso:[\"sec\",\"cot\",\"sin\"]}},function(e,t){e.exports={name:\"csch\",category:\"Trigonometry\",syntax:[\"csch(x)\"],description:\"Compute the hyperbolic cosecant of x in radians. Defined as 1/sinh(x)\",examples:[\"csch(2)\",\"1 / sinh(2)\"],seealso:[\"sech\",\"coth\",\"sinh\"]}},function(e,t){e.exports={name:\"sec\",category:\"Trigonometry\",syntax:[\"sec(x)\"],description:\"Compute the secant of x in radians. Defined as 1/cos(x)\",examples:[\"sec(2)\",\"1 / cos(2)\"],seealso:[\"cot\",\"csc\",\"cos\"]}},function(e,t){e.exports={name:\"sech\",category:\"Trigonometry\",syntax:[\"sech(x)\"],description:\"Compute the hyperbolic secant of x in radians. Defined as 1/cosh(x)\",examples:[\"sech(2)\",\"1 / cosh(2)\"],seealso:[\"coth\",\"csch\",\"cosh\"]}},function(e,t){e.exports={name:\"sin\",category:\"Trigonometry\",syntax:[\"sin(x)\"],description:\"Compute the sine of x in radians.\",examples:[\"sin(2)\",\"sin(pi / 4) ^ 2\",\"sin(90 deg)\",\"sin(30 deg)\",\"sin(0.2)^2 + cos(0.2)^2\"],seealso:[\"asin\",\"cos\",\"tan\"]}},function(e,t){e.exports={name:\"sinh\",category:\"Trigonometry\",syntax:[\"sinh(x)\"],description:\"Compute the hyperbolic sine of x in radians.\",examples:[\"sinh(0.5)\"],seealso:[\"cosh\",\"tanh\"]}},function(e,t){e.exports={name:\"tan\",category:\"Trigonometry\",syntax:[\"tan(x)\"],description:\"Compute the tangent of x in radians.\",examples:[\"tan(0.5)\",\"sin(0.5) / cos(0.5)\",\"tan(pi / 4)\",\"tan(45 deg)\"],seealso:[\"atan\",\"sin\",\"cos\"]}},function(e,t){e.exports={name:\"tanh\",category:\"Trigonometry\",syntax:[\"tanh(x)\"],description:\"Compute the hyperbolic tangent of x in radians.\",examples:[\"tanh(0.5)\",\"sinh(0.5) / cosh(0.5)\"],seealso:[\"sinh\",\"cosh\"]}},function(e,t){e.exports={name:\"to\",category:\"Units\",syntax:[\"x to unit\",\"to(x, unit)\"],description:\"Change the unit of a value.\",examples:[\"5 inch to cm\",\"3.2kg to g\",\"16 bytes in bits\"],seealso:[]}},function(e,t){e.exports={name:\"clone\",category:\"Utils\",syntax:[\"clone(x)\"],description:\"Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices\",examples:[\"clone(3.5)\",\"clone(2 - 4i)\",\"clone(45 deg)\",\"clone([1, 2; 3, 4])\",'clone(\"hello world\")'],seealso:[]}},function(e,t){e.exports={name:\"map\",category:\"Utils\",syntax:[\"map(x, callback)\"],description:\"Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.\",examples:[\"map([1, 2, 3], function(val) { return value * value })\"],seealso:[\"filter\",\"forEach\"]}},function(e,t){e.exports={name:\"partitionSelect\",category:\"Utils\",syntax:[\"partitionSelect(x, k)\",\"partitionSelect(x, k, compare)\"],description:\"Partition-based selection of an array or 1D matrix. Will find the kth smallest value, and mutates the input array. Uses Quickselect.\",examples:[\"partitionSelect([5, 10, 1], 2)\",'partitionSelect([\"C\", \"B\", \"A\", \"D\"], 1)'],seealso:[\"sort\"]}},function(e,t){e.exports={name:\"filter\",category:\"Utils\",syntax:[\"filter(x, test)\"],description:\"Filter items in a matrix.\",examples:[\"isPositive(x) = x > 0\",\"filter([6, -2, -1, 4, 3], isPositive)\",\"filter([6, -2, 0, 1, 0], x != 0)\"],seealso:[\"sort\",\"map\",\"forEach\"]}},function(e,t){e.exports={name:\"forEach\",category:\"Utils\",syntax:[\"forEach(x, callback)\"],description:\"Iterates over all elements of a matrix/array, and executes the given callback function.\",examples:[\"forEach([1, 2, 3], function(val) { console.log(val) })\"],seealso:[\"map\",\"sort\",\"filter\"]}},function(e,t){e.exports={name:\"format\",category:\"Utils\",syntax:[\"format(value)\",\"format(value, precision)\"],description:\"Format a value of any type as string.\",examples:[\"format(2.3)\",\"format(3 - 4i)\",\"format([])\",\"format(pi, 3)\"],seealso:[\"print\"]}},function(e,t){e.exports={name:\"isInteger\",category:\"Utils\",syntax:[\"isInteger(x)\"],description:\"Test whether a value is an integer number.\",examples:[\"isInteger(2)\",\"isInteger(3.5)\",\"isInteger([3, 0.5, -2])\"],seealso:[\"isNegative\",\"isNumeric\",\"isPositive\",\"isZero\"]}},function(e,t){e.exports={name:\"isNegative\",category:\"Utils\",syntax:[\"isNegative(x)\"],description:\"Test whether a value is negative: smaller than zero.\",examples:[\"isNegative(2)\",\"isNegative(0)\",\"isNegative(-4)\",\"isNegative([3, 0.5, -2])\"],seealso:[\"isInteger\",\"isNumeric\",\"isPositive\",\"isZero\"]}},function(e,t){e.exports={name:\"isNumeric\",category:\"Utils\",syntax:[\"isNumeric(x)\"],description:\"Test whether a value is a numeric value. Returns true when the input is a number, BigNumber, Fraction, or boolean.\",examples:[\"isNumeric(2)\",\"isNumeric(0)\",\"isNumeric(bignumber(500))\",\"isNumeric(fraction(0.125))\",'isNumeric(\"3\")',\"isNumeric(2 + 3i)\",'isNumeric([2.3, \"foo\", false])'],seealso:[\"isInteger\",\"isZero\",\"isNegative\",\"isPositive\"]}},function(e,t){e.exports={name:\"isPositive\",category:\"Utils\",syntax:[\"isPositive(x)\"],description:\"Test whether a value is positive: larger than zero.\",examples:[\"isPositive(2)\",\"isPositive(0)\",\"isPositive(-4)\",\"isPositive([3, 0.5, -2])\"],seealso:[\"isInteger\",\"isNumeric\",\"isNegative\",\"isZero\"]}},function(e,t){e.exports={name:\"isZero\",category:\"Utils\",syntax:[\"isZero(x)\"],description:\"Test whether a value is zero.\",examples:[\"isZero(2)\",\"isZero(0)\",\"isZero(-4)\",\"isZero([3, 0, -2, 0])\"],seealso:[\"isInteger\",\"isNumeric\",\"isNegative\",\"isPositive\"]}},function(e,t){e.exports={name:\"import\",category:\"Utils\",syntax:[\"import(string)\"],description:\"Import functions from a file.\",examples:['import(\"numbers\")','import(\"./mylib.js\")'],seealso:[]}},function(e,t){e.exports={name:\"sort\",category:\"Utils\",syntax:[\"sort(x)\",\"sort(x, compare)\"],description:'Sort the items in a matrix. Compare can be a string \"asc\" or \"desc\", or a custom sort function.',examples:[\"sort([5, 10, 1])\",'sort([\"C\", \"B\", \"A\", \"D\"])',\"sortByLength(a, b) = size(a)[1] - size(b)[1]\",'sort([\"Langdon\", \"Tom\", \"Sara\"], sortByLength)'],seealso:[\"map\",\"filter\",\"forEach\"]}},function(e,t){e.exports={name:\"typeof\",category:\"Utils\",syntax:[\"typeof(x)\"],description:\"Get the type of a variable.\",examples:[\"typeof(3.5)\",\"typeof(2 - 4i)\",\"typeof(45 deg)\",'typeof(\"hello world\")'],seealso:[]}},function(e,t,r){e.exports=[r(252),r(270),r(271),r(272),r(273)]},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(253));return a(\"compile\",{string:function(e){return o(e).compile()},\"Array | Matrix\":function(e){return i(e,function(e){return o(e).compile()})}})}var i=r(19);t.name=\"compile\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t,r){if(1!=arguments.length&&2!=arguments.length)throw new i(\"parse\",arguments.length,1,2);if(he=r&&r.nodes?r.nodes:{},\"string\"==typeof t)return ge=t,x();if(Array.isArray(t)||t instanceof e.Matrix)return a(t,function(e){if(\"string\"!=typeof e)throw new TypeError(\"String expected\");return ge=e,x()});throw new TypeError(\"String or matrix expected\")}function u(){ve=0,de=ge.charAt(0),we=0,be=null}function c(){ve++,de=ge.charAt(ve)}function f(){return ge.charAt(ve+1)}function l(){return ge.charAt(ve+2)}function p(){for(xe=le.NULL,ye=\"\";\" \"==de||\"\t\"==de||\"\\n\"==de&&we;)c();if(\"#\"==de)for(;\"\\n\"!=de&&\"\"!=de;)c();if(\"\"==de)return void(xe=le.DELIMITER);if(\"\\n\"==de&&!we)return xe=le.DELIMITER,ye=de,void c();var e=de+f(),t=e+l();if(3==t.length&&pe[t])return xe=le.DELIMITER,ye=t,c(),c(),void c();if(2==e.length&&pe[e])return xe=le.DELIMITER,ye=e,c(),void c();if(pe[de])return xe=le.DELIMITER,ye=de,void c();if(!d(de)){if(v()){for(;v()||y(de);)ye+=de,c();return void(xe=me[ye]?le.DELIMITER:le.SYMBOL)}for(xe=le.UNKNOWN;\"\"!=de;)ye+=de,c();throw X('Syntax error in part \"'+ye+'\"')}if(xe=le.NUMBER,\".\"==de)ye+=de,c(),y(de)||(xe=le.UNKNOWN);else{for(;y(de);)ye+=de,c();\".\"==de&&(ye+=de,c())}for(;y(de);)ye+=de,c();if(e=f(),(\"E\"==de||\"e\"==de)&&(y(e)||\"-\"==e||\"+\"==e))for(ye+=de,c(),(\"+\"==de||\"-\"==de)&&(ye+=de,c()),y(de)||(xe=le.UNKNOWN);y(de);)ye+=de,c()}function m(){do p();while(\"\\n\"==ye)}function h(){we++}function g(){we--}function v(){var e=ge.charAt(ve-1),t=ge.charAt(ve+1),r=function(e){return/^[a-zA-Z_\\u00C0-\\u02AF\\u0370-\\u03FF]$/.test(e)},n=function(e,t){return/^[\\uD835]$/.test(e)&&/^[\\uDC00-\\uDFFF]$/.test(t)&&/^[^\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]$/.test(t)};return r(de)||n(de,t)||n(e,de)}function d(e){return e>=\"0\"&&\"9\">=e||\".\"==e}function y(e){return e>=\"0\"&&\"9\">=e}function x(){u(),p();var e=w();if(\"\"!=ye)throw xe==le.DELIMITER?J(\"Unexpected operator \"+ye):X('Unexpected part \"'+ye+'\"');return e}function w(){var e,t,r=[];if(\"\"==ye)return new re(\"undefined\",\"undefined\");for(\"\\n\"!=ye&&\";\"!=ye&&(e=b());\"\\n\"==ye||\";\"==ye;)0==r.length&&e&&(t=\";\"!=ye,r.push({node:e,visible:t})),p(),\"\\n\"!=ye&&\";\"!=ye&&\"\"!=ye&&(e=b(),t=\";\"!=ye,r.push({node:e,visible:t}));return r.length>0?new ee(r):e}function b(){if(xe==le.SYMBOL&&\"function\"==ye)throw X('Deprecated keyword \"function\". Functions can now be assigned without it, like \"f(x) = x^2\".');return N()}function N(){var e,t,r,n,i=E();if(\"=\"==ye){if(i&&i.isSymbolNode)return e=i.name,m(),r=N(),new Q(e,r);if(i&&i.isIndexNode)return m(),r=N(),new fe(i,r);if(i&&i.isFunctionNode&&(n=!0,t=[],e=i.name,i.args.forEach(function(e,r){e&&e.isSymbolNode?t[r]=e.name:n=!1}),n))return m(),r=N(),new ne(e,t,r);throw X(\"Invalid left hand side of assignment operator =\")}return i}function E(){for(var e=M();\"?\"==ye;){var t=be;be=we,m();var r=e,n=M();if(\":\"!=ye)throw X(\"False part of conditional expression expected\");be=null,m();var i=E();e=new te(r,n,i),be=t}return e}function M(){for(var e=A();\"or\"==ye;)m(),e=new ae(\"or\",\"or\",[e,A()]);return e}function A(){for(var e=_();\"xor\"==ye;)m(),e=new ae(\"xor\",\"xor\",[e,_()]);return e}function _(){for(var e=O();\"and\"==ye;)m(),e=new ae(\"and\",\"and\",[e,O()]);return e}function O(){for(var e=T();\"|\"==ye;)m(),e=new ae(\"|\",\"bitOr\",[e,T()]);return e}function T(){for(var e=C();\"^|\"==ye;)m(),e=new ae(\"^|\",\"bitXor\",[e,C()]);return e}function C(){for(var e=S();\"&\"==ye;)m(),e=new ae(\"&\",\"bitAnd\",[e,S()]);return e}function S(){var e,t,r,n,i;for(e=z(),t={\"==\":\"equal\",\"!=\":\"unequal\",\"<\":\"smaller\",\">\":\"larger\",\"<=\":\"smallerEq\",\">=\":\"largerEq\"};ye in t;)r=ye,n=t[r],m(),i=[e,z()],e=new ae(r,n,i);return e}function z(){var e,t,r,n,i;for(e=B(),t={\"<<\":\"leftShift\",\">>\":\"rightArithShift\",\">>>\":\"rightLogShift\"};ye in t;)r=ye,n=t[r],m(),i=[e,B()],e=new ae(r,n,i);return e}function B(){var e,t,r,n,i;for(e=k(),t={to:\"to\",\"in\":\"to\"};ye in t;)r=ye,n=t[r],m(),i=[e,k()],e=new ae(r,n,i);return e}function k(){var e,t=[];if(e=\":\"==ye?new re(\"1\",\"number\"):I(),\":\"==ye&&be!==we){for(t.push(e);\":\"==ye&&t.length<3;)m(),\")\"==ye||\"]\"==ye||\",\"==ye||\"\"==ye?t.push(new ce(\"end\")):t.push(I());e=3==t.length?new ue(t[0],t[2],t[1]):new ue(t[0],t[1])}return e}function I(){var e,t,r,n,i;for(e=R(),t={\"+\":\"add\",\"-\":\"subtract\"};ye in t;)r=ye,n=t[r],m(),i=[e,R()],e=new ae(r,n,i);return e}function R(){var e,t,r,n,i;for(e=P(),t=e,r={\"*\":\"multiply\",\".*\":\"dotMultiply\",\"/\":\"divide\",\"./\":\"dotDivide\",\"%\":\"mod\",mod:\"mod\"};;)if(ye in r)n=ye,i=r[n],m(),t=P(),e=new ae(n,i,[e,t]);else{if(!(xe==le.SYMBOL||\"in\"==ye&&e&&e.isConstantNode||xe==le.NUMBER&&!t.isConstantNode||\"(\"==ye||\"[\"==ye))break;t=P(),e=new ae(\"*\",\"multiply\",[e,t])}return e}function P(){var e,t,r={\"-\":\"unaryMinus\",\"+\":\"unaryPlus\",\"~\":\"bitNot\",not:\"not\"}[ye];return r?(e=ye,m(),t=[P()],new ae(e,r,t)):U()}function U(){var e,t,r,n;return e=q(),(\"^\"==ye||\".^\"==ye)&&(t=ye,r=\"^\"==t?\"pow\":\"dotPow\",m(),n=[e,P()],e=new ae(t,r,n)),e}function q(){var e,t,r,n,i;for(e=L(),t={\"!\":\"factorial\",\"'\":\"transpose\"};ye in t;)r=ye,n=t[r],p(),i=[e],e=new ae(r,n,i);return e}function L(){var e,t=[];if(xe==le.SYMBOL&&he[ye]){if(e=he[ye],p(),\"(\"==ye){if(t=[],h(),p(),\")\"!=ye)for(t.push(E());\",\"==ye;)p(),t.push(E());if(\")\"!=ye)throw X(\"Parenthesis ) expected\");g(),p()}return new e(t)}return F()}function F(){var e,t;return xe==le.SYMBOL||xe==le.DELIMITER&&ye in me?(t=ye,p(),e=D(t),e=$(e)):j()}function D(e){var t;if(\"(\"==ye){if(t=[],h(),p(),\")\"!=ye)for(t.push(E());\",\"==ye;)p(),t.push(E());if(\")\"!=ye)throw X(\"Parenthesis ) expected\");return g(),p(),new se(e,t)}return new ce(e)}function $(e){for(var t;\"[\"==ye;){if(t=[],h(),p(),\"]\"!=ye)for(t.push(E());\",\"==ye;)p(),t.push(E());if(\"]\"!=ye)throw X(\"Parenthesis ] expected\");g(),p(),e=new ie(e,t)}return e}function j(){var e,t,r;if('\"'==ye){for(t=\"\",r=\"\";\"\"!=de&&('\"'!=de||\"\\\\\"==r);)t+=de,r=de,c();if(p(),'\"'!=ye)throw X('End of string \" expected');return p(),e=new re(t,\"string\"),e=$(e)}return G()}function G(){var e,t,r,n;if(\"[\"==ye){if(h(),p(),\"]\"!=ye){var i=H();if(\";\"==ye){for(r=1,t=[i];\";\"==ye;)p(),t[r]=H(),r++;if(\"]\"!=ye)throw X(\"End of matrix ] expected\");g(),p(),n=t[0].nodes.length;for(var a=1;r>a;a++)if(t[a].nodes.length!=n)throw J(\"Column dimensions mismatch (\"+t[a].nodes.length+\" != \"+n+\")\");e=new K(t)}else{if(\"]\"!=ye)throw X(\"End of matrix ] expected\");g(),p(),e=i}}else g(),p(),e=new K([]);return e}return Z()}function H(){for(var e=[N()],t=1;\",\"==ye;)p(),e[t]=N(),t++;return new K(e)}function Z(){var e;return xe==le.NUMBER?(e=ye,p(),new re(e,\"number\")):V()}function V(){var e;if(\"(\"==ye){if(h(),p(),e=N(),\")\"!=ye)throw X(\"Parenthesis ) expected\");return g(),p(),new oe(e)}return Y()}function Y(){throw X(\"\"==ye?\"Unexpected end of expression\":\"Value expected\")}function W(){return ve-ye.length+1}function X(e){var t=W(),r=new SyntaxError(e+\" (char \"+t+\")\");return r[\"char\"]=t,r}function J(e){var t=W(),r=new Error(e+\" (char \"+t+\")\");return r[\"char\"]=t,r}var K=n(r(254)),Q=n(r(257)),ee=n(r(259)),te=n(r(260)),re=n(r(261)),ne=n(r(262)),ie=n(r(263)),ae=n(r(266)),oe=n(r(268)),se=n(r(267)),ue=n(r(264)),ce=n(r(265)),fe=n(r(269)),le={NULL:0,DELIMITER:1,NUMBER:2,SYMBOL:3,UNKNOWN:4},pe={\",\":!0,\"(\":!0,\")\":!0,\"[\":!0,\"]\":!0,'\"':!0,\";\":!0,\"+\":!0,\"-\":!0,\"*\":!0,\".*\":!0,\"/\":!0,\"./\":!0,\"%\":!0,\"^\":!0,\".^\":!0,\"~\":!0,\"!\":!0,\"&\":!0,\"|\":!0,\"^|\":!0,\"'\":!0,\"=\":!0,\":\":!0,\"?\":!0,\"==\":!0,\"!=\":!0,\"<\":!0,\">\":!0,\"<=\":!0,\">=\":!0,\"<<\":!0,\">>\":!0,\">>>\":!0},me={mod:!0,to:!0,\"in\":!0,and:!0,xor:!0,or:!0,not:!0},he={},ge=\"\",ve=0,de=\"\",ye=\"\",xe=le.NULL,we=0,be=null;return s}var i=r(11),a=r(19);t.name=\"parse\",t.path=\"expression\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");if(this.nodes=e||[],!Array.isArray(this.nodes)||!this.nodes.every(function(e){return e&&e.isNode}))throw new TypeError(\"Array containing Nodes expected\")}var s=n(r(255));return o.prototype=new s,o.prototype.type=\"ArrayNode\",o.prototype.isArrayNode=!0,o.prototype._compile=function(e){var t=\"array\"!==e.math.config().matrix,r=this.nodes.map(function(t){return t._compile(e)});return(t?\"math.matrix([\":\"[\")+r.join(\",\")+(t?\"])\":\"]\")},o.prototype.forEach=function(e){for(var t=0;t<this.nodes.length;t++){var r=this.nodes[t];e(r,\"nodes[\"+t+\"]\",this)}},o.prototype.map=function(e){for(var t=[],r=0;r<this.nodes.length;r++)t[r]=this._ifNode(e(this.nodes[r],\"nodes[\"+r+\"]\",this));return new o(t)},o.prototype.clone=function(){return new o(this.nodes.slice(0))},o.prototype._toString=function(e){return i.format(this.nodes)},o.prototype._toTex=function(e){var t=\"\\\\begin{bmatrix}\";return this.nodes.forEach(function(r){t+=r.nodes?r.nodes.map(function(t){return t.toTex(e)}).join(\"&\"):r.toTex(e),t+=\"\\\\\\\\\"}),t+=\"\\\\end{bmatrix}\"},o}var i=r(23);t.name=\"ArrayNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n,a){function o(){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\")}function s(e){for(var t in e)if(e.hasOwnProperty(t)&&t in i)throw new Error('Scope contains an illegal symbol, \"'+t+'\" is a reserved keyword')}return o.prototype.eval=function(e){return this.compile().eval(e)},o.prototype.type=\"Node\",o.prototype.isNode=!0,o.prototype.compile=function(){if(arguments.length>0)throw new Error(\"Calling compile(math) is deprecated. Call the function as compile() instead.\");var e={math:a.expression.transform,args:{},_validateScope:s},t=this._compile(e),r=Object.keys(e).map(function(e){return\"    var \"+e+' = defs[\"'+e+'\"];'}),n=r.join(\" \")+'return {  \"eval\": function (scope) {    if (scope) _validateScope(scope);    scope = scope || {};    return '+t+\";  }};\",i=new Function(\"defs\",n);return i(e)},o.prototype._compile=function(e){throw new Error(\"Cannot compile a Node interface\")},o.prototype.forEach=function(e){throw new Error(\"Cannot run forEach on a Node interface\")},o.prototype.map=function(e){throw new Error(\"Cannot run map on a Node interface\")},o.prototype._ifNode=function(e){if(!e||!e.isNode)throw new TypeError(\"Callback function must return a Node\");return e},o.prototype.traverse=function(e){function t(e,r){e.forEach(function(e,n,i){r(e,n,i),t(e,r)})}e(this,null,null),t(this,e)},o.prototype.transform=function(e){function t(e,r){return e.map(function(e,n,i){var a=r(e,n,i);return t(a,r)})}var r=e(this,null,null);return t(r,e)},o.prototype.filter=function(e){var t=[];return this.traverse(function(r,n,i){e(r,n,i)&&t.push(r)}),t},o.prototype.find=function(){throw new Error(\"Function Node.find is deprecated. Use Node.filter instead.\")},o.prototype.match=function(){throw new Error(\"Function Node.match is deprecated. See functions Node.filter, Node.transform, Node.traverse.\")},o.prototype.clone=function(){throw new Error(\"Cannot clone a Node interface\")},o.prototype.toString=function(e){var t;if(e&&\"object\"==typeof e)switch(typeof e.handler){case\"object\":case\"undefined\":break;case\"function\":t=e.handler(this,e);break;default:throw new TypeError(\"Object or function expected as callback\")}return\"undefined\"!=typeof t?t:this._toString(e)},o.prototype._toString=function(){\nthrow new Error(\"_toString not implemented for \"+this.type)},o.prototype.toTex=function(e){var t;if(e&&\"object\"==typeof e)switch(typeof e.handler){case\"object\":case\"undefined\":break;case\"function\":t=e.handler(this,e);break;default:throw new TypeError(\"Object or function expected as callback\")}return\"undefined\"!=typeof t?t:this._toTex(e)},o.prototype._toTex=function(e){throw new Error(\"_toTex not implemented for \"+this.type)},o.prototype.getIdentifier=function(){return this.type},o.prototype.getContent=function(){return this},o}var i=r(256);r(3).extend;t.name=\"Node\",t.path=\"expression.node\",t.math=!0,t.factory=n},function(e,t){\"use strict\";e.exports={end:!0}},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"string\"!=typeof e)throw new TypeError('String expected for parameter \"name\"');if(!t||!t.isNode)throw new TypeError('Node expected for parameter \"expr\"');if(e in c)throw new Error('Illegal symbol name, \"'+e+'\" is a reserved keyword');this.name=e,this.expr=t}function s(e,t){var r=f.getPrecedence(e,t),n=f.getPrecedence(e.expr,t);return\"all\"===t||null!==n&&r>=n}var u=n(r(255)),c=(n(r(254)),r(256)),f=r(258);return o.prototype=new u,o.prototype.type=\"AssignmentNode\",o.prototype.isAssignmentNode=!0,o.prototype._compile=function(e){return'scope[\"'+this.name+'\"] = '+this.expr._compile(e)},o.prototype.forEach=function(e){e(this.expr,\"expr\",this)},o.prototype.map=function(e){return new o(this.name,this._ifNode(e(this.expr,\"expr\",this)))},o.prototype.clone=function(){return new o(this.name,this.expr)},o.prototype._toString=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.expr.toString(e);return s(this,t)&&(r=\"(\"+r+\")\"),this.name+\" = \"+r},o.prototype._toTex=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.expr.toTex(e);return s(this,t)&&(r=\"\\\\left(\"+r+\"\\\\right)\"),i.toSymbol(this.name)+\":=\"+r},o}var i=r(30);t.name=\"AssignmentNode\",t.path=\"expression.node\",t.factory=n},function(e,t){\"use strict\";function r(e,t){var r=e;\"keep\"!==t&&(r=e.getContent());for(var n=r.getIdentifier(),i=0;i<a.length;i++)if(n in a[i])return i;return null}function n(e,t){var n=e;\"keep\"!==t&&(n=e.getContent());var i=n.getIdentifier(),o=r(n,t);if(null===o)return null;var s=a[o][i];if(s.hasOwnProperty(\"associativity\")){if(\"left\"===s.associativity)return\"left\";if(\"right\"===s.associativity)return\"right\";throw Error(\"'\"+i+\"' has the invalid associativity '\"+s.associativity+\"'.\")}return null}function i(e,t,n){var i=e,o=t;if(\"keep\"!==n)var i=e.getContent(),o=t.getContent();var s=i.getIdentifier(),u=o.getIdentifier(),c=r(i,n);if(null===c)return null;var f=a[c][s];if(f.hasOwnProperty(\"associativeWith\")&&f.associativeWith instanceof Array){for(var l=0;l<f.associativeWith.length;l++)if(f.associativeWith[l]===u)return!0;return!1}return null}var a=[{AssignmentNode:{},FunctionAssignmentNode:{}},{ConditionalNode:{latexLeftParens:!1,latexRightParens:!1,latexParens:!1}},{\"OperatorNode:or\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:xor\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:and\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:bitOr\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:bitXor\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:bitAnd\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:equal\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:unequal\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:smaller\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:larger\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:smallerEq\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:largerEq\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:leftShift\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:rightArithShift\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:rightLogShift\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:to\":{associativity:\"left\",associativeWith:[]}},{RangeNode:{}},{\"OperatorNode:add\":{associativity:\"left\",associativeWith:[\"OperatorNode:add\",\"OperatorNode:subtract\"]},\"OperatorNode:subtract\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:multiply\":{associativity:\"left\",associativeWith:[\"OperatorNode:multiply\",\"OperatorNode:divide\",\"Operator:dotMultiply\",\"Operator:dotDivide\"]},\"OperatorNode:divide\":{associativity:\"left\",associativeWith:[],latexLeftParens:!1,latexRightParens:!1,latexParens:!1},\"OperatorNode:dotMultiply\":{associativity:\"left\",associativeWith:[\"OperatorNode:multiply\",\"OperatorNode:divide\",\"OperatorNode:dotMultiply\",\"OperatorNode:doDivide\"]},\"OperatorNode:dotDivide\":{associativity:\"left\",associativeWith:[]},\"OperatorNode:mod\":{associativity:\"left\",associativeWith:[]}},{\"OperatorNode:unaryPlus\":{associativity:\"right\"},\"OperatorNode:unaryMinus\":{associativity:\"right\"},\"OperatorNode:bitNot\":{associativity:\"right\"},\"OperatorNode:not\":{associativity:\"right\"}},{\"OperatorNode:pow\":{associativity:\"right\",associativeWith:[],latexRightParens:!1},\"OperatorNode:dotPow\":{associativity:\"right\",associativeWith:[]}},{\"OperatorNode:factorial\":{associativity:\"left\"}},{\"OperatorNode:transpose\":{associativity:\"left\"}}];e.exports.properties=a,e.exports.getPrecedence=r,e.exports.getAssociativity=n,e.exports.isAssociativeWith=i},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!Array.isArray(e))throw new Error(\"Array expected\");this.blocks=e.map(function(e){var t=e&&e.node,r=e&&void 0!==e.visible?e.visible:!0;if(!t||!t.isNode)throw new TypeError('Property \"node\" must be a Node');if(\"boolean\"!=typeof r)throw new TypeError('Property \"visible\" must be a boolean');return{node:t,visible:r}})}var o=n(r(255)),s=n(r(71));return a.prototype=new o,a.prototype.type=\"BlockNode\",a.prototype.isBlockNode=!0,a.prototype._compile=function(e){e.ResultSet=s;var t=this.blocks.map(function(t){var r=t.node._compile(e);return t.visible?\"results.push(\"+r+\");\":r+\";\"});return\"(function () {var results = [];\"+t.join(\"\")+\"return new ResultSet(results);})()\"},a.prototype.forEach=function(e){for(var t=0;t<this.blocks.length;t++)e(this.blocks[t].node,\"blocks[\"+t+\"].node\",this)},a.prototype.map=function(e){for(var t=[],r=0;r<this.blocks.length;r++){var n=this.blocks[r],i=this._ifNode(e(n.node,\"blocks[\"+r+\"].node\",this));t[r]={node:i,visible:n.visible}}return new a(t)},a.prototype.clone=function(){var e=this.blocks.map(function(e){return{node:e.node,visible:e.visible}});return new a(e)},a.prototype._toString=function(e){return this.blocks.map(function(t){return t.node.toString(e)+(t.visible?\"\":\";\")}).join(\"\\n\")},a.prototype._toTex=function(e){return this.blocks.map(function(t){return t.node.toTex(e)+(t.visible?\"\":\";\")}).join(\"\\\\;\\\\;\\n\")},a}t.name=\"BlockNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t,r){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e||!e.isNode)throw new TypeError(\"Parameter condition must be a Node\");if(!t||!t.isNode)throw new TypeError(\"Parameter trueExpr must be a Node\");if(!r||!r.isNode)throw new TypeError(\"Parameter falseExpr must be a Node\");this.condition=e,this.trueExpr=t,this.falseExpr=r}var s=n(r(255));return o.prototype=new s,o.prototype.type=\"ConditionalNode\",o.prototype.isConditionalNode=!0,o.prototype._compile=function(e){return e.testCondition=function(t){if(\"number\"==typeof t||\"boolean\"==typeof t||\"string\"==typeof t)return t?!0:!1;if(t){if(t.isBigNumber===!0)return t.isZero()?!1:!0;if(t.isComplex===!0)return t.re||t.im?!0:!1;if(t.isUnit===!0)return t.value?!0:!1}if(null===t||void 0===t)return!1;throw new TypeError('Unsupported type of condition \"'+e.math[\"typeof\"](t)+'\"')},\"testCondition(\"+this.condition._compile(e)+\") ? ( \"+this.trueExpr._compile(e)+\") : ( \"+this.falseExpr._compile(e)+\")\"},o.prototype.forEach=function(e){e(this.condition,\"condition\",this),e(this.trueExpr,\"trueExpr\",this),e(this.falseExpr,\"falseExpr\",this)},o.prototype.map=function(e){return new o(this._ifNode(e(this.condition,\"condition\",this)),this._ifNode(e(this.trueExpr,\"trueExpr\",this)),this._ifNode(e(this.falseExpr,\"falseExpr\",this)))},o.prototype.clone=function(){return new o(this.condition,this.trueExpr,this.falseExpr)},o.prototype._toString=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=i.getPrecedence(this,t),n=this.condition.toString(e),a=i.getPrecedence(this.condition,t);(\"all\"===t||\"OperatorNode\"===this.condition.type||null!==a&&r>=a)&&(n=\"(\"+n+\")\");var o=this.trueExpr.toString(e),s=i.getPrecedence(this.trueExpr,t);(\"all\"===t||\"OperatorNode\"===this.trueExpr.type||null!==s&&r>=s)&&(o=\"(\"+o+\")\");var u=this.falseExpr.toString(e),c=i.getPrecedence(this.falseExpr,t);return(\"all\"===t||\"OperatorNode\"===this.falseExpr.type||null!==c&&r>=c)&&(u=\"(\"+u+\")\"),n+\" ? \"+o+\" : \"+u},o.prototype._toTex=function(e){return\"\\\\left\\\\{\\\\begin{array}{l l}{\"+this.trueExpr.toTex(e)+\"}, &\\\\quad{\\\\text{if}\\\\;\"+this.condition.toTex(e)+\"}\\\\\\\\{\"+this.falseExpr.toTex(e)+\"}, &\\\\quad{\\\\text{otherwise}}\\\\end{array}\\\\right.\"},o}var i=(r(30),r(258));t.name=\"ConditionalNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");if(t){if(\"string\"!=typeof t)throw new TypeError('String expected for parameter \"valueType\"');if(\"string\"!=typeof e)throw new TypeError('String expected for parameter \"value\"');this.value=e,this.valueType=t}else this.value=e+\"\",this.valueType=i(e);if(!u[this.valueType])throw new TypeError('Unsupported type of value \"'+this.valueType+'\"')}var s=n(r(255)),u={number:!0,string:!0,\"boolean\":!0,undefined:!0,\"null\":!0};return o.prototype=new s,o.prototype.type=\"ConstantNode\",o.prototype.isConstantNode=!0,o.prototype._compile=function(e){switch(this.valueType){case\"number\":var t=e.math.config().number;return\"bignumber\"===t?'math.bignumber(\"'+this.value+'\")':\"fraction\"===t?'math.fraction(\"'+this.value+'\")':this.value.replace(/^(0*)[0-9]/,function(e,t){return e.substring(t.length)});case\"string\":return'\"'+this.value+'\"';case\"boolean\":return this.value;case\"undefined\":return this.value;case\"null\":return this.value;default:throw new TypeError('Unsupported type of constant \"'+this.valueType+'\"')}},o.prototype.forEach=function(e){},o.prototype.map=function(e){return this.clone()},o.prototype.clone=function(){return new o(this.value,this.valueType)},o.prototype._toString=function(e){switch(this.valueType){case\"string\":return'\"'+this.value+'\"';default:return this.value}},o.prototype._toTex=function(e){var t,r=this.value;switch(this.valueType){case\"string\":return'\\\\mathtt{\"'+r+'\"}';case\"number\":return t=r.toLowerCase().indexOf(\"e\"),-1!==t?r.substring(0,t)+\"\\\\cdot10^{\"+r.substring(t+1)+\"}\":r;default:return r}},o}var i=r(41).type;t.name=\"ConstantNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e){return\"string\"==typeof e}function i(e,t,i,u){function c(e,t,r){if(!(this instanceof c))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"string\"!=typeof e)throw new TypeError('String expected for parameter \"name\"');if(!Array.isArray(t)||!t.every(n))throw new TypeError('Array containing strings expected for parameter \"params\"');if(!r||!r.isNode)throw new TypeError('Node expected for parameter \"expr\"');if(e in a)throw new Error('Illegal function name, \"'+e+'\" is a reserved keyword');this.name=e,this.params=t,this.expr=r}function f(e,t){var r=s.getPrecedence(e,t),n=s.getPrecedence(e.expr,t);return\"all\"===t||null!==n&&r>=n}var l=i(r(255));return c.prototype=new l,c.prototype.type=\"FunctionAssignmentNode\",c.prototype.isFunctionAssignmentNode=!0,c.prototype._compile=function(e){return this.params.forEach(function(t){e.args[t]=!0}),'scope[\"'+this.name+'\"] =   (function () {    var fn = function '+this.name+\"(\"+this.params.join(\",\")+\") {      if (arguments.length != \"+this.params.length+') {        throw new SyntaxError(\"Wrong number of arguments in function '+this.name+' (\" + arguments.length + \" provided, '+this.params.length+' expected)\");      }      return '+this.expr._compile(e)+'    };    fn.syntax = \"'+this.name+\"(\"+this.params.join(\", \")+')\";    return fn;  })()'},c.prototype.forEach=function(e){e(this.expr,\"expr\",this)},c.prototype.map=function(e){var t=this._ifNode(e(this.expr,\"expr\",this));return new c(this.name,this.params.slice(0),t)},c.prototype.clone=function(){return new c(this.name,this.params.slice(0),this.expr)},c.prototype._toString=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.expr.toString(e);return f(this,t)&&(r=\"(\"+r+\")\"),\"function \"+this.name+\"(\"+this.params.join(\", \")+\") = \"+r},c.prototype._toTex=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.expr.toTex(e);return f(this,t)&&(r=\"\\\\left(\"+r+\"\\\\right)\"),\"\\\\mathrm{\"+this.name+\"}\\\\left(\"+this.params.map(o.toSymbol).join(\",\")+\"\\\\right):=\"+r},c}var a=r(256),o=r(30),s=r(258);t.name=\"FunctionAssignmentNode\",t.path=\"expression.node\",t.factory=i},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e||!e.isNode)throw new TypeError('Node expected for parameter \"object\"');if(!c(t)||!t.every(function(e){return e&&e.isNode}))throw new TypeError('Array containing Nodes expected for parameter \"ranges\"');this.object=e,this.ranges=t}function o(e){switch(e.object.type){case\"ArrayNode\":case\"ConstantNode\":case\"SymbolNode\":case\"ParenthesisNode\":return!1;default:return!0}}var s=n(r(255)),u=(n(r(264)),n(r(265)),n(r(66))),c=Array.isArray;return a.prototype=new s,a.prototype.type=\"IndexNode\",a.prototype.isIndexNode=!0,a.prototype._compile=function(e){return this.compileSubset(e)},a.prototype.compileSubset=function(e,t){function r(e){return e&&e.isSymbolNode&&\"end\"==e.name}var n=!1,i=this.ranges.map(function(e){var t=e.filter(r).length>0;return n=t?t:n,t});e.range=function(e,t,r){return new u(e&&e.isBigNumber===!0?e.toNumber():e,t&&t.isBigNumber===!0?t.toNumber():t,r&&r.isBigNumber===!0?r.toNumber():r)};var a=this.ranges.map(function(t,r){var n=i[r];return t&&t.isRangeNode?n?(e.args.end=!0,\"(function () {  var end = size[\"+r+\"];  return range(    \"+t.start._compile(e)+\",     \"+t.end._compile(e)+\",     \"+(t.step?t.step._compile(e):\"1\")+\"  );})()\"):\"range(\"+t.start._compile(e)+\", \"+t.end._compile(e)+\", \"+(t.step?t.step._compile(e):\"1\")+\")\":n?(e.args.end=!0,\"(function () {  var end = size[\"+r+\"];  return \"+t._compile(e)+\";})()\"):t._compile(e)});return n?\"(function () {  var obj = \"+this.object._compile(e)+\";  var size = math.size(obj).valueOf();  return math.subset(    obj,     math.index(\"+a.join(\", \")+\")    \"+(t?\", \"+t:\"\")+\"  );})()\":\"math.subset(\"+this.object._compile(e)+\",math.index(\"+a.join(\", \")+\")\"+(t?\", \"+t:\"\")+\")\"},a.prototype.forEach=function(e){e(this.object,\"object\",this);for(var t=0;t<this.ranges.length;t++)e(this.ranges[t],\"ranges[\"+t+\"]\",this)},a.prototype.map=function(e){for(var t=this._ifNode(e(this.object,\"object\",this)),r=[],n=0;n<this.ranges.length;n++)r[n]=this._ifNode(e(this.ranges[n],\"ranges[\"+n+\"]\",this));return new a(t,r)},a.prototype.objectName=function(){return this.object.name},a.prototype.clone=function(){return new a(this.object,this.ranges.slice(0))},a.prototype._toString=function(e){var t=this.object.toString(e);return o(this)&&(t=\"(\"+t+\"(\"),t+\"[\"+this.ranges.join(\", \")+\"]\"},a.prototype._toTex=function(e){var t=this.object.toTex(e);o(this)&&(t=\"\\\\left(\"+t+\"\\\\right)\");var r=this.ranges.map(function(t){return t.toTex(e)});return t+\"_{\"+r.join(\",\")+\"}\"},a}t.name=\"IndexNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t,r){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e||!e.isNode)throw new TypeError(\"Node expected\");if(!t||!t.isNode)throw new TypeError(\"Node expected\");if(r&&(!r||!r.isNode))throw new TypeError(\"Node expected\");if(arguments.length>3)throw new Error(\"Too many arguments\");this.start=e,this.end=t,this.step=r||null}function s(e,t){var r=i.getPrecedence(e,t),n={},a=i.getPrecedence(e.start,t);if(n.start=null!==a&&r>=a||\"all\"===t,e.step){var o=i.getPrecedence(e.step,t);n.step=null!==o&&r>=o||\"all\"===t}var s=i.getPrecedence(e.end,t);return n.end=null!==s&&r>=s||\"all\"===t,n}var u=n(r(255));return o.prototype=new u,o.prototype.type=\"RangeNode\",o.prototype.isRangeNode=!0,o.prototype._compile=function(e){return\"math.range(\"+this.start._compile(e)+\", \"+this.end._compile(e)+(this.step?\", \"+this.step._compile(e):\"\")+\")\"},o.prototype.forEach=function(e){e(this.start,\"start\",this),e(this.end,\"end\",this),this.step&&e(this.step,\"step\",this)},o.prototype.map=function(e){return new o(this._ifNode(e(this.start,\"start\",this)),this._ifNode(e(this.end,\"end\",this)),this.step&&this._ifNode(e(this.step,\"step\",this)))},o.prototype.clone=function(){return new o(this.start,this.end,this.step&&this.step)},o.prototype._toString=function(e){var t,r=e&&e.parenthesis?e.parenthesis:\"keep\",n=s(this,r),i=this.start.toString(e);if(n.start&&(i=\"(\"+i+\")\"),t=i,this.step){var a=this.step.toString(e);n.step&&(a=\"(\"+a+\")\"),t+=\":\"+a}var o=this.end.toString(e);return n.end&&(o=\"(\"+o+\")\"),t+=\":\"+o},o.prototype._toTex=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=s(this,t),n=this.start.toTex(e);if(r.start&&(n=\"\\\\left(\"+n+\"\\\\right)\"),this.step){var i=this.step.toTex(e);r.step&&(i=\"\\\\left(\"+i+\"\\\\right)\"),n+=\":\"+i}var a=this.end.toTex(e);return r.end&&(a=\"\\\\left(\"+a+\"\\\\right)\"),n+=\":\"+a},o}var i=r(258);t.name=\"RangeNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a,o){function s(e){if(!(this instanceof s))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"string\"!=typeof e)throw new TypeError('String expected for parameter \"name\"');this.name=e}function u(e){throw new Error(\"Undefined symbol \"+e)}var c=n(r(255)),f=n(r(28));return s.prototype=new c,s.prototype.type=\"SymbolNode\",s.prototype.isSymbolNode=!0,s.prototype._compile=function(e){return e.undef=u,e.Unit=f,this.name in e.args?this.name:this.name in e.math?'(\"'+this.name+'\" in scope ? scope[\"'+this.name+'\"] : math[\"'+this.name+'\"])':'(\"'+this.name+'\" in scope ? scope[\"'+this.name+'\"] : '+(f.isValuelessUnit(this.name)?'new Unit(null, \"'+this.name+'\")':'undef(\"'+this.name+'\")')+\")\"},s.prototype.forEach=function(e){},s.prototype.map=function(e){return this.clone()},s.prototype.clone=function(){return new s(this.name)},s.prototype._toString=function(e){return this.name},s.prototype._toTex=function(e){var t=!1;\"undefined\"==typeof o[this.name]&&f.isValuelessUnit(this.name)&&(t=!0);var r=i.toSymbol(this.name,t);return\"\\\\\"===r[0]?r:\" \"+r},s}var i=r(30);t.name=\"SymbolNode\",t.path=\"expression.node\",t.math=!0,t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o,s){function u(e,t,r){if(!(this instanceof u))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"string\"!=typeof e)throw new TypeError('string expected for parameter \"op\"');if(\"string\"!=typeof t)throw new TypeError('string expected for parameter \"fn\"');if(!Array.isArray(r)||!r.every(function(e){return e&&e.isNode}))throw new TypeError('Array containing Nodes expected for parameter \"args\"');this.op=e,this.fn=t,this.args=r||[]}function c(e,t,r,n){var i=a.getPrecedence(e,t),o=a.getAssociativity(e,t);if(\"all\"===t||r.length>2){var s=[];return r.forEach(function(e){switch(e.getContent().type){case\"ArrayNode\":case\"ConstantNode\":case\"SymbolNode\":case\"ParenthesisNode\":s.push(!1);break;default:s.push(!0)}}),s}switch(r.length){case 0:return[];case 1:var u=a.getPrecedence(r[0],t);if(n&&null!==u){var c,f;if(\"keep\"===t?(c=r[0].getIdentifier(),f=e.getIdentifier()):(c=r[0].getContent().getIdentifier(),f=e.getContent().getIdentifier()),a.properties[i][f].latexLeftParens===!1)return[!1];if(a.properties[u][c].latexParens===!1)return[!1]}return null===u?[!1]:i>=u?[!0]:[!1];case 2:var l,p=a.getPrecedence(r[0],t),m=a.isAssociativeWith(e,r[0],t);l=null===p?!1:p!==i||\"right\"!==o||m?i>p?!0:!1:!0;var h,g=a.getPrecedence(r[1],t),v=a.isAssociativeWith(e,r[1],t);if(h=null===g?!1:g!==i||\"left\"!==o||v?i>g?!0:!1:!0,n){var f,d,y;\"keep\"===t?(f=e.getIdentifier(),d=e.args[0].getIdentifier(),y=e.args[1].getIdentifier()):(f=e.getContent().getIdentifier(),d=e.args[0].getContent().getIdentifier(),y=e.args[1].getContent().getIdentifier()),null!==p&&(a.properties[i][f].latexLeftParens===!1&&(l=!1),a.properties[p][d].latexParens===!1&&(l=!1)),null!==g&&(a.properties[i][f].latexRightParens===!1&&(h=!1),a.properties[g][y].latexParens===!1&&(h=!1))}return[l,h]}}var f=n(r(255));n(r(261)),n(r(265)),n(r(267));return u.prototype=new f,u.prototype.type=\"OperatorNode\",u.prototype.isOperatorNode=!0,u.prototype._compile=function(e){if(!(this.fn in e.math))throw new Error(\"Function \"+this.fn+' missing in provided namespace \"math\"');var t=this.args.map(function(t){return t._compile(e)});return\"math.\"+this.fn+\"(\"+t.join(\", \")+\")\"},u.prototype.forEach=function(e){for(var t=0;t<this.args.length;t++)e(this.args[t],\"args[\"+t+\"]\",this)},u.prototype.map=function(e){for(var t=[],r=0;r<this.args.length;r++)t[r]=this._ifNode(e(this.args[r],\"args[\"+r+\"]\",this));return new u(this.op,this.fn,t)},u.prototype.clone=function(){return new u(this.op,this.fn,this.args.slice(0))},u.prototype._toString=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.args,n=c(this,t,r,!1);switch(r.length){case 1:var i=a.getAssociativity(this,t),o=r[0].toString(e);return n[0]&&(o=\"(\"+o+\")\"),\"right\"===i?this.op+o:\"left\"===i?o+this.op:o+this.op;case 2:var s=r[0].toString(e),u=r[1].toString(e);return n[0]&&(s=\"(\"+s+\")\"),n[1]&&(u=\"(\"+u+\")\"),s+\" \"+this.op+\" \"+u;default:return this.fn+\"(\"+this.args.join(\", \")+\")\"}},u.prototype._toTex=function(e){var t=e&&e.parenthesis?e.parenthesis:\"keep\",r=this.args,n=c(this,t,r,!0),o=i.operators[this.fn];switch(o=\"undefined\"==typeof o?this.op:o,r.length){case 1:var s=a.getAssociativity(this,t),u=r[0].toTex(e);return n[0]&&(u=\"\\\\left(\"+u+\"\\\\right)\"),\"right\"===s?o+u:\"left\"===s?u+o:u+o;case 2:var f=r[0],l=f.toTex(e);n[0]&&(l=\"\\\\left(\"+l+\"\\\\right)\");var p=r[1],m=p.toTex(e);n[1]&&(m=\"\\\\left(\"+m+\"\\\\right)\");var h;switch(h=\"keep\"===t?f.getIdentifier():f.getContent().getIdentifier(),this.getIdentifier()){case\"OperatorNode:divide\":return o+\"{\"+l+\"}{\"+m+\"}\";case\"OperatorNode:pow\":switch(l=\"{\"+l+\"}\",m=\"{\"+m+\"}\",h){case\"ConditionalNode\":case\"OperatorNode:divide\":l=\"\\\\left(\"+l+\"\\\\right)\"}}return l+o+m;default:return\"\\\\mathrm{\"+this.fn+\"}\\\\left(\"+r.map(function(t){return t.toTex(e)}).join(\",\")+\"\\\\right)\"}},u.prototype.getIdentifier=function(){return this.type+\":\"+this.fn},u}var i=r(30),a=r(258);t.name=\"OperatorNode\",t.path=\"expression.node\",t.math=!0,t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a,o){function s(e,t){if(!(this instanceof s))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"string\"!=typeof e)throw new TypeError('string expected for parameter \"name\"');if(!Array.isArray(t)||!t.every(function(e){return e&&e.isNode}))throw new TypeError('Array containing Nodes expected for parameter \"args\"');this.name=e,this.args=t||[]}function u(e,t,r){for(var n,i=\"\",a=new RegExp(\"\\\\$(?:\\\\{([a-z_][a-z_0-9]*)(?:\\\\[([0-9]+)\\\\])?\\\\}|\\\\$)\",\"ig\"),o=0;null!==(n=a.exec(e));)if(i+=e.substring(o,n.index),o=n.index,\"$$\"===n[0])i+=\"$\",o++;else{o+=n[0].length;var s=t[n[1]];if(!s)throw new ReferenceError(\"Template: Property \"+n[1]+\" does not exist.\");if(void 0===n[2])switch(typeof s){case\"string\":i+=s;break;case\"object\":if(s.isNode)i+=s.toTex(r);else{if(!Array.isArray(s))throw new TypeError(\"Template: \"+n[1]+\" has to be a Node, String or array of Nodes\");i+=s.map(function(e,t){if(e&&e.isNode)return e.toTex(r);throw new TypeError(\"Template: \"+n[1]+\"[\"+t+\"] is not a Node.\")}).join(\",\")}break;default:throw new TypeError(\"Template: \"+n[1]+\" has to be a Node, String or array of Nodes\")}else{if(!s[n[2]]||!s[n[2]].isNode)throw new TypeError(\"Template: \"+n[1]+\"[\"+n[2]+\"] is not a Node.\");i+=s[n[2]].toTex(r)}}return i+=e.slice(o)}var c=n(r(255)),f=n(r(265));s.prototype=new c,s.prototype.type=\"FunctionNode\",s.prototype.isFunctionNode=!0,s.prototype._compile=function(e){var t=e.math[this.name],r=\"function\"==typeof t&&1==t.rawArgs,n=this.args.map(function(t){return t._compile(e)});if(r){var i,a=0;do i=\"p\"+a,a++;while(i in e);return e[i]=this.args,'(\"'+this.name+'\" in scope ? scope[\"'+this.name+'\"]('+n.join(\", \")+') : math[\"'+this.name+'\"]('+i+\", math, scope))\"}var o=new f(this.name);return o._compile(e)+\"(\"+n.join(\", \")+\")\"},s.prototype.forEach=function(e){for(var t=0;t<this.args.length;t++)e(this.args[t],\"args[\"+t+\"]\",this)},s.prototype.map=function(e){for(var t=[],r=0;r<this.args.length;r++)t[r]=this._ifNode(e(this.args[r],\"args[\"+r+\"]\",this));return new s(this.name,t)},s.prototype.clone=function(){return new s(this.name,this.args.slice(0))};var l=s.prototype.toString;s.prototype.toString=function(e){var t;return e&&\"object\"==typeof e.handler&&e.handler.hasOwnProperty(this.name)&&(t=e.handler[this.name](this,e)),\"undefined\"!=typeof t?t:l.call(this,e)},s.prototype._toString=function(e){return this.name+\"(\"+this.args.join(\", \")+\")\"};var p=s.prototype.toTex;return s.prototype.toTex=function(e){var t;return e&&\"object\"==typeof e.handler&&e.handler.hasOwnProperty(this.name)&&(t=e.handler[this.name](this,e)),\"undefined\"!=typeof t?t:p.call(this,e)},s.prototype._toTex=function(e){var t,r=(e&&e.parenthesis?e.parenthesis:\"keep\",this.args.map(function(t){return t.toTex(e)}));!o[this.name]||\"function\"!=typeof o[this.name].toTex&&\"object\"!=typeof o[this.name].toTex&&\"string\"!=typeof o[this.name].toTex||(t=o[this.name].toTex);var n;switch(typeof t){case\"function\":n=t(this,e);break;case\"string\":n=u(t,this,e);break;case\"object\":switch(typeof t[r.length]){case\"function\":n=t[r.length](this,e);break;case\"string\":n=u(t[r.length],this,e)}}return\"undefined\"!=typeof n?n:u(i.defaultTemplate,this,e)},s.prototype.getIdentifier=function(){return this.type+\":\"+this.name},s}var i=r(30);t.name=\"FunctionNode\",t.path=\"expression.node\",t.math=!0,t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e||!e.isNode)throw new TypeError('Node expected for parameter \"content\"');this.content=e}var o=n(r(255));return a.prototype=new o,a.prototype.type=\"ParenthesisNode\",a.prototype.isParenthesisNode=!0,a.prototype._compile=function(e){return this.content._compile(e)},a.prototype.getContent=function(){return this.content.getContent()},a.prototype.forEach=function(e){e(this.content,\"content\",this)},a.prototype.map=function(e){var t=e(this.content,\"content\",this);return new a(t)},a.prototype.clone=function(){return new a(this.content)},a.prototype._toString=function(e){return!e||e&&\"keep\"===e.parenthesis?\"(\"+this.content.toString(e)+\")\":this.content.toString(e)},a.prototype._toTex=function(e){return!e||e&&\"keep\"===e.parenthesis?\"\\\\left(\"+this.content.toTex(e)+\"\\\\right)\":this.content.toTex(e)},a}t.name=\"ParenthesisNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){if(!(this instanceof a))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e||!e.isIndexNode)throw new TypeError('Expected IndexNode for parameter \"index\"');if(!t||!t.isNode)throw new TypeError('Expected Node for parameter \"expr\"');this.index=e,this.expr=t}var o=n(r(255));n(r(263));return a.prototype=new o,a.prototype.type=\"UpdateNode\",a.prototype.isUpdateNode=!0,a.prototype._compile=function(e){var t=this.index.objectName()in e.args?this.name+\" = \":'scope[\"'+this.index.objectName()+'\"]',r=this.index.compileSubset(e,this.expr._compile(e));return t+\" = \"+r},a.prototype.forEach=function(e){e(this.index,\"index\",this),e(this.expr,\"expr\",this)},a.prototype.map=function(e){return new a(this._ifNode(e(this.index,\"index\",this)),this._ifNode(e(this.expr,\"expr\",this)))},a.prototype.clone=function(){return new a(this.index,this.expr)},a.prototype._toString=function(e){var t=this.expr.toString(e);return e&&\"all\"===e.parenthesis&&(t=\"(\"+t+\")\"),this.index.toString(e)+\" = \"+t},a.prototype._toTex=function(e){var t=this.expr.toTex(e);return e&&\"all\"===e.parenthesis&&(t=\"\\\\left(\"+t+\"\\\\right)\"),this.index.toTex(e)+\":=\"+t},a}t.name=\"UpdateNode\",t.path=\"expression.node\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(253));return a(\"compile\",{string:function(e){var t={};return o(e).compile().eval(t)},\"string, Object\":function(e,t){return o(e).compile().eval(t)},\"Array | Matrix\":function(e){var t={};return i(e,function(e){return o(e).compile().eval(t)})},\"Array | Matrix, Object\":function(e,t){return i(e,function(e){return o(e).compile().eval(t)})}})}var i=r(19);t.name=\"eval\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i,a){var o=n(r(81));return i(\"help\",{any:function(t){var r,n=t;if(\"string\"!=typeof t)for(r in a)if(a.hasOwnProperty(r)&&t===a[r]){n=r;break}var i=o[n];if(!i)throw new Error('No documentation found on \"'+n+'\"');return new e.Help(i)}})}t.math=!0,t.name=\"help\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(253));return i(\"parse\",{\"string | Array | Matrix\":a,\"string | Array | Matrix, Object\":a})}t.name=\"parse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i,a){var o=n(r(274));return i(\"parser\",{\"\":function(){return new o(a)}})}t.name=\"parser\",t.factory=n,t.math=!0},function(e,t,r){\"use strict\";function n(e,t,n,i,a){function o(){if(!(this instanceof o))throw new SyntaxError(\"Constructor must be called with the new operator\");this.scope={}}var s=n(r(253));return o.prototype.type=\"Parser\",o.prototype.isParser=!0,o.prototype.parse=function(e){throw new Error(\"Parser.parse is deprecated. Use math.parse instead.\")},o.prototype.compile=function(e){throw new Error(\"Parser.compile is deprecated. Use math.compile instead.\")},o.prototype.eval=function(e){return s(e).compile().eval(this.scope)},o.prototype.get=function(e){return this.scope[e]},o.prototype.set=function(e,t){return this.scope[e]=t},o.prototype.remove=function(e){delete this.scope[e]},o.prototype.clear=function(){for(var e in this.scope)this.scope.hasOwnProperty(e)&&delete this.scope[e]},o}t.name=\"Parser\",t.path=\"expression\",t.factory=n,t.math=!0},function(e,t,r){e.exports=[r(254),r(257),r(259),r(260),r(261),r(263),r(262),r(267),r(255),r(266),r(268),r(264),r(265),r(269)]},function(e,t,r){e.exports=[r(277),r(280),r(282),r(284),r(285),r(287),r(292),r(305),r(307),r(309)]},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(279));return a(\"concat\",{\"...any\":function(e){var t=e.length-1,r=e[t];\"number\"==typeof r?e[t]=r-1:r&&r.isBigNumber===!0&&(e[t]=r.minus(1));try{return o.apply(null,e)}catch(n){throw i(n)}}})}var i=r(278).transform;t.name=\"concat\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){var n=r(43);t.transform=function(e){return e&&e.isIndexError?new n(e.index+1,e.min+1,e.max+1):e}},function(e,t,r){\"use strict\";function n(e,t,n,f){var l=n(r(51)),p=f(\"concat\",{\"...Array | Matrix | number | BigNumber\":function(e){var t,r,n=e.length,f=-1,p=!1,m=[];for(t=0;n>t;t++){var h=e[t];if(h&&h.isMatrix===!0&&(p=!0),\"number\"==typeof h||h&&h.isBigNumber===!0){if(t!==n-1)throw new Error(\"Dimension must be specified as last argument\");if(r=f,f=h.valueOf(),!o(f))throw new TypeError(\"Integer number expected for dimension\");if(0>f)throw new u(f);if(t>0&&f>r)throw new u(f,r+1)}else{var g=a(h).valueOf(),v=s.size(g);if(m[t]=g,r=f,f=v.length-1,t>0&&f!=r)throw new c(r+1,f+1)}}if(0==m.length)throw new SyntaxError(\"At least one matrix expected\");for(var d=m.shift();m.length;)d=i(d,m.shift(),f,0);return p?l(d):d},\"...string\":function(e){return e.join(\"\")}});return p.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",\np}function i(e,t,r,n){if(r>n){if(e.length!=t.length)throw new c(e.length,t.length);for(var a=[],o=0;o<e.length;o++)a[o]=i(e[o],t[o],r,n+1);return a}return e.concat(t)}var a=r(3).clone,o=r(6).isInteger,s=r(40),u=r(43),c=r(42);t.name=\"concat\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t,r){var n,i;if(e[0]&&(n=e[0].compile().eval(r)),e[1])if(e[1]&&e[1].isSymbolNode)i=e[1].compile().eval(r);else{var a=r||{},s=e[1].filter(function(e){return e&&e.isSymbolNode&&!(e.name in t)&&!(e.name in a)})[0],u=Object.create(a),c=e[1].compile();if(!s)throw new Error(\"No undefined variable found in filter equation\");var f=s.name;i=function(e){return u[f]=e,c.eval(u)}}return o(n,i)}var o=n(r(281));n(r(265));return a.rawArgs=!0,a}t.name=\"filter\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(51)),u=o(\"filter\",{\"Array, function\":i,\"Array, RegExp\":a,\"Matrix, function\":function(e,t){return s(i(e.toArray(),t))},\"Matrix, RegExp\":function(e,t){return s(a(e.toArray(),t))}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}function i(e,t){if(1!==o(e).length)throw new Error(\"Only one dimensional matrices supported\");return e.filter(function(e){return t(e)})}function a(e,t){if(1!==o(e).length)throw new Error(\"Only one dimensional matrices supported\");return e.filter(function(e){return t.test(e)})}var o=r(40).size;t.name=\"filter\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){n(r(283));return i(\"forEach\",{\"Array | Matrix, function\":function(e,t){var r=function(n,i){Array.isArray(n)?n.forEach(function(e,t){r(e,i.concat(t+1))}):t(n,i,e)};r(e.valueOf(),[])}})}t.name=\"forEach\",t.path=\"expression.transform\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,i){var a=i(\"forEach\",{\"Array, function\":n,\"Matrix, function\":function(e,t){return e.forEach(t)}});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}function n(e,t){var r=function(n,i){Array.isArray(n)?n.forEach(function(e,t){r(e,i.concat(t))}):t(n,i,e)};r(e,[])}t.name=\"forEach\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n){n(r(67));return function(){for(var t=[],r=0,n=arguments.length;n>r;r++){var i=arguments[r];if(i&&i.isRange===!0)i.start--,i.end-=i.step>0?0:2;else if(i&&i.isSet===!0)i=i.map(function(e){return e-1});else if(i&&(i.isArray===!0||i.isMatrix))i=i.map(function(e){return e-1});else if(\"number\"==typeof i)i--;else{if(!i||i.isBigNumber!==!0)throw new TypeError(\"Ranges must be a Number, Range, Array or Matrix\");i=i.toNumber()-1}t[r]=i}var a=new e.Index;return e.Index.apply(a,t),a}}Array.isArray;t.name=\"index\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=(n(r(286)),n(r(51)));return a(\"max\",{\"Array, function\":function(e,t){return i(e,t,e)},\"Matrix, function\":function(e,t){return o(i(e.valueOf(),t,e))}})}function i(e,t,r){function n(e,i){return Array.isArray(e)?e.map(function(e,t){return n(e,i.concat(t+1))}):t(e,i,r)}return n(e,[])}t.name=\"map\",t.path=\"expression.transform\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,i){var a=i(\"map\",{\"Array, function\":n,\"Matrix, function\":function(e,t){return e.map(t)}});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}function n(e,t){var r=function(n,i){return Array.isArray(n)?n.map(function(e,t){return r(e,i.concat(t))}):t(n,i,e)};return r(e,[])}t.name=\"map\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(289));return o(\"max\",{\"...any\":function(e){if(2==e.length&&a(e[0])){var t=e[1];\"number\"==typeof t?e[1]=t-1:t&&t.isBigNumber===!0&&(e[1]=t.minus(1))}try{return s.apply(null,e)}catch(r){throw i(r)}}})}var i=r(278).transform,a=r(288);t.name=\"max\",t.path=\"expression.transform\",t.factory=n},function(e,t){\"use strict\";e.exports=function(e){return Array.isArray(e)||e&&e.isMatrix===!0}},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e,t){return c(e,t)?e:t}function u(e){var t=void 0;if(i(e,function(e){(void 0===t||c(e,t))&&(t=e)}),void 0===t)throw new Error(\"Cannot calculate max of an empty array\");return t}var c=n(r(63)),f=o(\"max\",{\"Array | Matrix\":u,\"Array | Matrix, number | BigNumber\":function(e,t){return a(e,t.valueOf(),s)},\"...\":function(){return u(arguments)}});return f.toTex=\"\\\\max\\\\left(${args}\\\\right)\",f}var i=r(290),a=r(291);t.name=\"max\",t.factory=n},function(e,t){\"use strict\";e.exports=function r(e,t){e&&e.isMatrix===!0&&(e=e.valueOf());for(var n=0,i=e.length;i>n;n++){var a=e[n];Array.isArray(a)?r(a,t):t(a)}}},function(e,t,r){\"use strict\";function n(e,t,r){var a,o,s,u;if(0>=t){if(Array.isArray(e[0])){for(u=i(e),o=[],a=0;a<u.length;a++)o[a]=n(u[a],t-1,r);return o}for(s=e[0],a=1;a<e.length;a++)s=r(s,e[a]);return s}for(o=[],a=0;a<e.length;a++)o[a]=n(e[a],t-1,r);return o}function i(e){var t,r,n=e.length,i=e[0].length,a=[];for(r=0;i>r;r++){var o=[];for(t=0;n>t;t++)o.push(e[t][r]);a.push(o)}return a}var a=r(40).size,o=r(43);e.exports=function(e,t,r){var i=Array.isArray(e)?a(e):e.size();if(0>t)throw new o(t);if(t>=i.length)throw new o(t,i.length);return e&&e.isMatrix===!0?e.create(n(e.valueOf(),t,r)):n(e,t,r)}},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(293));return o(\"mean\",{\"...any\":function(e){if(2==e.length&&a(e[0])){var t=e[1];\"number\"==typeof t?e[1]=t-1:t&&t.isBigNumber===!0&&(e[1]=t.minus(1))}try{return s.apply(null,e)}catch(r){throw i(r)}}})}var i=r(278).transform,a=r(288);t.name=\"mean\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){function u(e,t){var r=o(e,t,f),n=Array.isArray(e)?i(e):e.size();return l(r,n[t])}function c(e){var t=0,r=0;if(a(e,function(e){t=f(t,e),r++}),0===r)throw new Error(\"Cannot calculate mean of an empty array\");return l(t,r)}var f=n(r(50)),l=n(r(294)),p=s(\"mean\",{\"Array | Matrix\":c,\"Array | Matrix, number | BigNumber\":u,\"...\":function(){return c(arguments)}});return p.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",p}var i=r(40).size,a=r(290),o=r(291);t.name=\"mean\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(295)),s=n(r(296)),u=n(r(299)),c=n(r(51)),f=n(r(298)),l=n(r(57)),p=a(\"divide\",i({\"Array | Matrix, Array | Matrix\":function(e,t){return s(e,u(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,o,!1);break;case\"dense\":r=l(e,t,o,!1)}return r},\"Array, any\":function(e,t){return l(c(e),t,o,!1).valueOf()},\"any, Array | Matrix\":function(e,t){return s(e,u(t))}},o.signatures));return p.toTex=\"\\\\frac{${args[0]}}{${args[1]}}\",p}var i=r(3).extend;t.name=\"divide\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){function i(t,r){var n=r.re*r.re+r.im*r.im;return 0!=n?new e.Complex((t.re*r.re+t.im*r.im)/n,(t.im*r.re-t.re*r.im)/n):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?t.im/0:0)}var a=n(\"divide\",{\"number, number\":function(e,t){return e/t},\"Complex, Complex\":i,\"BigNumber, BigNumber\":function(e,t){return e.div(t)},\"Fraction, Fraction\":function(e,t){return e.div(t)},\"Unit, number\":function(e,t){var r=e.clone();return r.value=(null===r.value?r._normalize(1):r.value)/t,r},\"number, Unit\":function(e,t){var r=t.pow(-1);return r.value=(null===r.value?r._normalize(1):r.value)*e,r},\"Unit, Unit\":function(e,t){return e.divide(t)}});return a}t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(52)),f=n(r(297)),l=n(r(48)),p=n(r(298)),m=n(r(57)),h=e.DenseMatrix,g=e.SparseMatrix,v=o(\"multiply\",i({\"Array, Array\":function(e,t){d(a.size(e),a.size(t));var r=v(u(e),u(t));return r&&r.isMatrix===!0?r.valueOf():r},\"Matrix, Matrix\":function(e,t){var r=e.size(),n=t.size();return d(r,n),1===r.length?1===n.length?y(e,t,r[0]):x(e,t):1===n.length?b(e,t):N(e,t)},\"Matrix, Array\":function(e,t){return v(e,u(t))},\"Array, Matrix\":function(e,t){return v(u(e,t.storage()),t)},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=p(e,t,f,!1);break;case\"dense\":r=m(e,t,f,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=p(t,e,f,!0);break;case\"dense\":r=m(t,e,f,!0)}return r},\"Array, any\":function(e,t){return m(u(e),t,f,!1).valueOf()},\"any, Array\":function(e,t){return m(u(t),e,f,!0).valueOf()}},f.signatures)),d=function(e,t){switch(e.length){case 1:switch(t.length){case 1:if(e[0]!==t[0])throw new RangeError(\"Dimension mismatch in multiplication. Vectors must have the same length\");break;case 2:if(e[0]!==t[0])throw new RangeError(\"Dimension mismatch in multiplication. Vector length (\"+e[0]+\") must match Matrix rows (\"+t[0]+\")\");break;default:throw new Error(\"Can only multiply a 1 or 2 dimensional matrix (Matrix B has \"+t.length+\" dimensions)\")}break;case 2:switch(t.length){case 1:if(e[1]!==t[0])throw new RangeError(\"Dimension mismatch in multiplication. Matrix columns (\"+e[1]+\") must match Vector length (\"+t[0]+\")\");break;case 2:if(e[1]!==t[0])throw new RangeError(\"Dimension mismatch in multiplication. Matrix A columns (\"+e[1]+\") must match Matrix B rows (\"+t[0]+\")\");break;default:throw new Error(\"Can only multiply a 1 or 2 dimensional matrix (Matrix B has \"+t.length+\" dimensions)\")}break;default:throw new Error(\"Can only multiply a 1 or 2 dimensional matrix (Matrix A has \"+e.length+\" dimensions)\")}},y=function(e,t,r){if(0===r)throw new Error(\"Cannot multiply two empty vectors\");var n,i=e._data,a=e._datatype,s=t._data,u=t._datatype,l=c,p=f;a&&u&&a===u&&\"string\"==typeof a&&(n=a,l=o.find(c,[n,n]),p=o.find(f,[n,n]));for(var m=p(i[0],s[0]),h=1;r>h;h++)m=l(m,p(i[h],s[h]));return m},x=function(e,t){switch(t.storage()){case\"dense\":return w(e,t)}throw new Error(\"Not implemented\")},w=function(e,t){var r,n=e._data,i=e._size,a=e._datatype,s=t._data,u=t._size,l=t._datatype,p=i[0],m=u[1],g=c,v=f;a&&l&&a===l&&\"string\"==typeof a&&(r=a,g=o.find(c,[r,r]),v=o.find(f,[r,r]));for(var d=[],y=0;m>y;y++){for(var x=v(n[0],s[0][y]),w=1;p>w;w++)x=g(x,v(n[w],s[w][y]));d[y]=x}return 1===m?d[0]:new h({data:d,size:[m],datatype:r})},b=function(e,t){switch(e.storage()){case\"dense\":return E(e,t);case\"sparse\":return _(e,t)}},N=function(e,t){switch(e.storage()){case\"dense\":switch(t.storage()){case\"dense\":return M(e,t);case\"sparse\":return A(e,t)}break;case\"sparse\":switch(t.storage()){case\"dense\":return O(e,t);case\"sparse\":return T(e,t)}}},E=function(e,t){var r,n=e._data,i=e._size,a=e._datatype,s=t._data,u=t._datatype,l=i[0],p=i[1],m=c,g=f;a&&u&&a===u&&\"string\"==typeof a&&(r=a,m=o.find(c,[r,r]),g=o.find(f,[r,r]));for(var v=[],d=0;l>d;d++){for(var y=n[d],x=g(y[0],s[0]),w=1;p>w;w++)x=m(x,g(y[w],s[w]));v[d]=x}return 1===l?v[0]:new h({data:v,size:[l],datatype:r})},M=function(e,t){var r,n=e._data,i=e._size,a=e._datatype,s=t._data,u=t._size,l=t._datatype,p=i[0],m=i[1],g=u[1],v=c,d=f;a&&l&&a===l&&\"string\"==typeof a&&(r=a,v=o.find(c,[r,r]),d=o.find(f,[r,r]));for(var y=[],x=0;p>x;x++){var w=n[x];y[x]=[];for(var b=0;g>b;b++){for(var N=d(w[0],s[0][b]),E=1;m>E;E++)N=v(N,d(w[E],s[E][b]));y[x][b]=N}}return 1===p&&1===g?y[0][0]:new h({data:y,size:[p,g],datatype:r})},A=function(e,t){var r=e._data,n=e._size,i=e._datatype,a=t._values,s=t._index,u=t._ptr,p=t._size,m=t._datatype;if(!a)throw new Error(\"Cannot multiply Dense Matrix times Pattern only Matrix\");var h,v=n[0],d=p[1],y=c,x=f,w=l,b=0;i&&m&&i===m&&\"string\"==typeof i&&(h=i,y=o.find(c,[h,h]),x=o.find(f,[h,h]),w=o.find(l,[h,h]),b=o.convert(0,h));for(var N=[],E=[],M=[],A=new g({values:N,index:E,ptr:M,size:[v,d],datatype:h}),_=0;d>_;_++){M[_]=E.length;var O=u[_],T=u[_+1];if(T>O)for(var C=0,S=0;v>S;S++){for(var z,B=S+1,k=O;T>k;k++){var I=s[k];C!==B?(z=x(r[S][I],a[k]),C=B):z=y(z,x(r[S][I],a[k]))}C!==B||w(z,b)||(E.push(S),N.push(z))}}return M[d]=E.length,1===v&&1===d?1===N.length?N[0]:0:A},_=function(e,t){var r=e._values,n=e._index,i=e._ptr,a=e._datatype;if(!r)throw new Error(\"Cannot multiply Pattern only Matrix times Dense Matrix\");var s,u=t._data,p=t._datatype,m=e._size[0],h=t._size[0],v=[],d=[],y=[],x=c,w=f,b=l,N=0;a&&p&&a===p&&\"string\"==typeof a&&(s=a,x=o.find(c,[s,s]),w=o.find(f,[s,s]),b=o.find(l,[s,s]),N=o.convert(0,s));var E=[],M=[];y[0]=0;for(var A=0;h>A;A++){var _=u[A];if(!b(_,N))for(var O=i[A],T=i[A+1],C=O;T>C;C++){var S=n[C];M[S]?E[S]=x(E[S],w(_,r[C])):(M[S]=!0,d.push(S),E[S]=w(_,r[C]))}}for(var z=d.length,B=0;z>B;B++){var k=d[B];v[B]=E[k]}return y[1]=d.length,1===m?1===v.length?v[0]:0:new g({values:v,index:d,ptr:y,size:[m,1],datatype:s})},O=function(e,t){var r=e._values,n=e._index,i=e._ptr,a=e._datatype;if(!r)throw new Error(\"Cannot multiply Pattern only Matrix times Dense Matrix\");var s,u=t._data,p=t._datatype,m=e._size[0],h=t._size[0],v=t._size[1],d=c,y=f,x=l,w=0;a&&p&&a===p&&\"string\"==typeof a&&(s=a,d=o.find(c,[s,s]),y=o.find(f,[s,s]),x=o.find(l,[s,s]),w=o.convert(0,s));for(var b=[],N=[],E=[],M=new g({values:b,index:N,ptr:E,size:[m,v],datatype:s}),A=[],_=[],O=0;v>O;O++){E[O]=N.length;for(var T=O+1,C=0;h>C;C++){var S=u[C][O];if(!x(S,w))for(var z=i[C],B=i[C+1],k=z;B>k;k++){var I=n[k];_[I]!==T?(_[I]=T,N.push(I),A[I]=y(S,r[k])):A[I]=d(A[I],y(S,r[k]))}}for(var R=E[O],P=N.length,U=R;P>U;U++){var q=N[U];b[U]=A[q]}}return E[v]=N.length,1===m&&1===v?1===b.length?b[0]:0:M},T=function(e,t){var r,n=e._values,i=e._index,a=e._ptr,s=e._datatype,u=t._values,l=t._index,p=t._ptr,m=t._datatype,h=e._size[0],v=t._size[1],d=n&&u,y=c,x=f;s&&m&&s===m&&\"string\"==typeof s&&(r=s,y=o.find(c,[r,r]),x=o.find(f,[r,r]));for(var w,b,N,E,M,A,_,O,T=d?[]:void 0,C=[],S=[],z=new g({values:T,index:C,ptr:S,size:[h,v],datatype:r}),B=d?[]:void 0,k=[],I=0;v>I;I++){S[I]=C.length;var R=I+1;for(M=p[I],A=p[I+1],E=M;A>E;E++)if(O=l[E],d)for(b=a[O],N=a[O+1],w=b;N>w;w++)_=i[w],k[_]!==R?(k[_]=R,C.push(_),B[_]=x(u[E],n[w])):B[_]=y(B[_],x(u[E],n[w]));else for(b=a[O],N=a[O+1],w=b;N>w;w++)_=i[w],k[_]!==R&&(k[_]=R,C.push(_));if(d)for(var P=S[I],U=C.length,q=P;U>q;q++){var L=C[q];T[q]=B[L]}}return S[v]=C.length,1===h&&1===v&&d?1===T.length?T[0]:0:z};return v.toTex=\"\\\\left(${args[0]}\"+s.operators.multiply+\"${args[1]}\\\\right)\",v}var i=r(3).extend,a=r(40);t.name=\"multiply\",t.factory=n},function(e,t){\"use strict\";function r(e,t,r,n){var i=n(\"multiplyScalar\",{\"number, number\":function(e,t){return e*t},\"Complex, Complex\":function(t,r){return new e.Complex(t.re*r.re-t.im*r.im,t.re*r.im+t.im*r.re)},\"BigNumber, BigNumber\":function(e,t){return e.times(t)},\"Fraction, Fraction\":function(e,t){return e.mul(t)},\"number, Unit\":function(e,t){var r=t.clone();return r.value=null===r.value?r._normalize(e):r.value*e,r},\"Unit, number\":function(e,t){var r=e.clone();return r.value=null===r.value?r._normalize(t):r.value*t,r},\"Unit, Unit\":function(e,t){return e.multiply(t)}});return i}t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(48)),o=e.SparseMatrix,s=function(e,t,r,n){var s=e._values,u=e._index,c=e._ptr,f=e._size,l=e._datatype;if(!s)throw new Error(\"Cannot perform operation on Pattern Sparse Matrix and Scalar value\");var p,m=f[0],h=f[1],g=a,v=0,d=r;\"string\"==typeof l&&(p=l,g=i.find(a,[p,p]),v=i.convert(0,p),t=i.convert(t,p),d=i.find(r,[p,p]));for(var y=[],x=[],w=[],b=new o({values:y,index:x,ptr:w,size:[m,h],datatype:p}),N=0;h>N;N++){w[N]=x.length;for(var E=c[N],M=c[N+1],A=E;M>A;A++){var _=u[A],O=n?d(t,s[A]):d(s[A],t);g(O,v)||(x.push(_),y.push(O))}}return w[h]=x.length,b};return s}t.name=\"algorithm11\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t,r){var n,i,a,o,s;if(1==t){if(o=e[0][0],0==o)throw Error(\"Cannot calculate inverse, determinant is zero\");return[[u(1,o)]]}if(2==t){var h=p(e);if(0==h)throw Error(\"Cannot calculate inverse, determinant is zero\");return[[u(e[1][1],h),u(l(e[0][1]),h)],[u(l(e[1][0]),h),u(e[0][0],h)]]}var g=e.concat();for(n=0;t>n;n++)g[n]=g[n].concat();for(var v=m(t).valueOf(),d=0;r>d;d++){for(n=d;t>n&&0==g[n][d];)n++;if(n==t||0==g[n][d])throw Error(\"Cannot calculate inverse, determinant is zero\");n!=d&&(s=g[d],g[d]=g[n],g[n]=s,s=v[d],v[d]=v[n],v[n]=s);var y=g[d],x=v[d];for(n=0;t>n;n++){var w=g[n],b=v[n];if(n!=d){if(0!=w[d]){for(a=u(l(w[d]),y[d]),i=d;r>i;i++)w[i]=c(w[i],f(a,y[i]));for(i=0;r>i;i++)b[i]=c(b[i],f(a,x[i]))}}else{for(a=y[d],i=d;r>i;i++)w[i]=u(w[i],a);for(i=0;r>i;i++)b[i]=u(b[i],a)}}}return v}var s=n(r(51)),u=n(r(295)),c=n(r(52)),f=n(r(296)),l=n(r(300)),p=n(r(301)),m=n(r(304)),h=a(\"inv\",{\"Array | Matrix\":function(e){var t=e.isMatrix===!0?e.size():i.array.size(e);switch(t.length){case 1:if(1==t[0])return e.isMatrix===!0?s([u(1,e.valueOf()[0])]):[u(1,e[0])];throw new RangeError(\"Matrix must be square (size: \"+i.string.format(t)+\")\");case 2:var r=t[0],n=t[1];if(r==n)return e.isMatrix===!0?s(o(e.valueOf(),r,n),e.storage()):o(e,r,n);throw new RangeError(\"Matrix must be square (size: \"+i.string.format(t)+\")\");default:throw new RangeError(\"Matrix must be two dimensional (size: \"+i.string.format(t)+\")\")}},any:function(e){return u(1,e)}});return h.toTex=\"\\\\left(${args[0]}\\\\right)^{-1}\",h}var i=r(39);t.name=\"inv\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=a(\"unaryMinus\",{number:function(e){return-e},Complex:function(t){return new e.Complex(-t.re,-t.im)},BigNumber:function(e){return e.neg()},Fraction:function(e){return e.neg()},Unit:function(e){var t=e.clone();return t.value=-e.value,t},\"Array | Matrix\":function(e){return i(e,s,!0)}});return s.toTex=o.operators.unaryMinus+\"\\\\left(${args[0]}\\\\right)\",s}var i=r(19);t.name=\"unaryMinus\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function s(e,t,r){if(1==t)return a.clone(e[0][0]);if(2==t)return f(l(e[0][0],e[1][1]),l(e[1][0],e[0][1]));for(var n=function(e){var t,r,n=new Array(e.length),i=0;for(t=1;t<e.length;t++)i=c(i,e[t][t]);for(t=0;t<e.length;t++){for(n[t]=new Array(e.length),n[t][t]=p(i),r=0;t>r;r++)n[t][r]=0;for(r=t+1;r<e.length;r++)n[t][r]=e[t][r];t+1<e.length&&(i=f(i,e[t+1][t+1]))}return n},i=e,o=0;t-1>o;o++)i=l(n(i),e);return t%2==0?p(i[0][0]):i[0][0]}var u=n(r(51)),c=n(r(50)),f=n(r(302)),l=n(r(296)),p=n(r(300)),m=i(\"det\",{any:function(e){return a.clone(e)},\"Array | Matrix\":function(e){var t;switch(e&&e.isMatrix===!0?t=e.size():Array.isArray(e)?(e=u(e),t=e.size()):t=[],t.length){case 0:return a.clone(e);case 1:if(1==t[0])return a.clone(e.valueOf()[0]);throw new RangeError(\"Matrix must be square (size: \"+o.format(t)+\")\");case 2:var r=t[0],n=t[1];if(r==n)return s(e.clone().valueOf(),r,n);throw new RangeError(\"Matrix must be square (size: \"+o.format(t)+\")\");default:throw new RangeError(\"Matrix must be two dimensional (size: \"+o.format(t)+\")\")}}});return m.toTex=\"\\\\det\\\\left(${args[0]}\\\\right)\",m}var i=r(39),a=i.object,o=i.string;t.name=\"det\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=n(r(51)),u=n(r(52)),c=n(r(300)),f=n(r(53)),l=n(r(60)),p=n(r(303)),m=n(r(55)),h=n(r(56)),g=n(r(57)),v=a(\"subtract\",{\"number, number\":function(e,t){return e-t},\"Complex, Complex\":function(t,r){return new e.Complex(t.re-r.re,t.im-r.im)},\"BigNumber, BigNumber\":function(e,t){return e.minus(t)},\"Fraction, Fraction\":function(e,t){return e.sub(t)},\"Unit, Unit\":function(e,t){if(null==e.value)throw new Error(\"Parameter x contains a unit with undefined value\");if(null==t.value)throw new Error(\"Parameter y contains a unit with undefined value\");if(!e.equalBase(t))throw new Error(\"Units do not match\");var r=e.clone();return r.value-=t.value,r.fixPrefix=!1,r},\"Matrix, Matrix\":function(e,t){var r=e.size(),n=t.size();if(r.length!==n.length)throw new i(r.length,n.length);var a;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":a=p(e,t,v);break;default:a=l(t,e,v,!0)}break;default:switch(t.storage()){case\"sparse\":a=f(e,t,v,!1);break;default:a=h(e,t,v)}}return a},\"Array, Array\":function(e,t){return v(s(e),s(t)).valueOf()},\"Array, Matrix\":function(e,t){return v(s(e),t)},\"Matrix, Array\":function(e,t){return v(e,s(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=m(e,c(t),u);break;default:r=g(e,t,v)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=m(t,e,v,!0);break;default:r=g(t,e,v,!0)}return r},\"Array, any\":function(e,t){return g(s(e),t,v,!1).valueOf()},\"any, Array\":function(e,t){return g(s(t),e,v,!0).valueOf()}});return v.toTex=\"\\\\left(${args[0]}\"+o.operators.subtract+\"${args[1]}\\\\right)\",v}var i=r(42);t.name=\"subtract\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(48)),s=e.SparseMatrix,u=function(e,t,r){var n=e._values,u=e._index,c=e._ptr,f=e._size,l=e._datatype,p=t._values,m=t._index,h=t._ptr,g=t._size,v=t._datatype;if(f.length!==g.length)throw new i(f.length,g.length);if(f[0]!==g[0]||f[1]!==g[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+f+\") must match Matrix B (\"+g+\")\");var d,y=f[0],x=f[1],w=o,b=0,N=r;\"string\"==typeof l&&l===v&&(d=l,w=a.find(o,[d,d]),b=a.convert(0,d),N=a.find(r,[d,d]));var E,M,A,_,O=n&&p?[]:void 0,T=[],C=[],S=new s({values:O,index:T,ptr:C,size:[y,x],datatype:d}),z=O?[]:void 0,B=O?[]:void 0,k=[],I=[];for(M=0;x>M;M++){C[M]=T.length;var R=M+1;for(A=c[M],_=c[M+1];_>A;A++)E=u[A],T.push(E),k[E]=R,z&&(z[E]=n[A]);for(A=h[M],_=h[M+1];_>A;A++)E=m[A],k[E]!==R&&T.push(E),I[E]=R,B&&(B[E]=p[A]);if(O)for(A=C[M];A<T.length;){E=T[A];var P=k[E],U=I[E];if(P===R||U===R){var q=P===R?z[E]:b,L=U===R?B[E]:b,F=N(q,L);w(F,b)?T.splice(A,1):(O.push(F),A++)}}}return C[x]=T.length,S};return u}var i=r(42);t.name=\"algorithm05\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e,t){switch(e.length){case 0:return t?c(t):[];case 1:return u(e[0],e[0],t);case 2:return u(e[0],e[1],t);default:throw new Error(\"Vector containing two values expected\")}}function u(t,r,n){var o=t&&t.isBigNumber===!0?e.BigNumber:r&&r.isBigNumber===!0?e.BigNumber:null;if(t&&t.isBigNumber===!0&&(t=t.toNumber()),r&&r.isBigNumber===!0&&(r=r.toNumber()),!a(t)||1>t)throw new Error(\"Parameters in function eye must be positive integers\");if(!a(r)||1>r)throw new Error(\"Parameters in function eye must be positive integers\");var s=o?new e.BigNumber(1):1,u=o?new o(0):0,c=[t,r];if(n){var f=e.Matrix.storage(n);return f.diagonal(c,s,0,u)}for(var l=i.resize([],c,u),p=r>t?t:r,m=0;p>m;m++)l[m][m]=s;return l}var c=n(r(51)),f=o(\"eye\",{\"\":function(){return\"matrix\"===t.matrix?c([]):[]},string:function(e){return c(e)},\"number | BigNumber\":function(e){return u(e,e,\"matrix\"===t.matrix?\"default\":void 0)},\"number | BigNumber, string\":function(e,t){return u(e,e,t)},\"number | BigNumber, number | BigNumber\":function(e,r){return u(e,r,\"matrix\"===t.matrix?\"default\":void 0)},\"number | BigNumber, number | BigNumber, string\":function(e,t,r){return u(e,t,r)},Array:function(e){return s(e)},\"Array, string\":function(e,t){return s(e,t)},Matrix:function(e){return s(e.valueOf(),e.storage())},\"Matrix, string\":function(e,t){return s(e.valueOf(),t)}});return f.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",f}var i=r(40),a=r(6).isInteger;t.name=\"eye\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(306));return o(\"min\",{\"...any\":function(e){if(2==e.length&&a(e[0])){var t=e[1];\"number\"==typeof t?e[1]=t-1:t&&t.isBigNumber===!0&&(e[1]=t.minus(1))}try{return s.apply(null,e)}catch(r){throw i(r)}}})}var i=r(278).transform,a=r(288);t.name=\"min\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e,t){return c(e,t)?e:t}function u(e){var t=void 0;if(i(e,function(e){(void 0===t||c(e,t))&&(t=e)}),void 0===t)throw new Error(\"Cannot calculate min of an empty array\");return t}var c=n(r(59)),f=o(\"min\",{\"Array | Matrix\":u,\"Array | Matrix, number | BigNumber\":function(e,t){return a(e,t.valueOf(),s)},\"...\":function(){return u(arguments)}});return f.toTex=\"\\\\min\\\\left(${args}\\\\right)\",f}var i=r(290),a=r(291);t.name=\"min\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(308));return i(\"range\",{\"...any\":function(e){var t=e.length-1,r=e[t];return\"boolean\"!=typeof r&&e.push(!0),a.apply(null,e)}})}t.name=\"range\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e){return\"array\"===t.matrix?e:p(e)}function o(r,n){var i=l(r);if(!i)throw new SyntaxError('String \"'+r+'\" is no valid range');var o;return\"bignumber\"===t.number?(o=n?f:c,a(o(new e.BigNumber(i.start),new e.BigNumber(i.end),new e.BigNumber(i.step)))):(o=n?u:s,a(o(i.start,i.end,i.step)))}function s(e,t,r){var n=[],i=e;if(r>0)for(;t>i;)n.push(i),i+=r;else if(0>r)for(;i>t;)n.push(i),i+=r;return n}function u(e,t,r){var n=[],i=e;if(r>0)for(;t>=i;)n.push(i),i+=r;else if(0>r)for(;i>=t;)n.push(i),i+=r;return n}function c(e,t,r){var n=[],i=e;if(r.gt(m))for(;i.lt(t);)n.push(i),i=i.plus(r);else if(r.lt(m))for(;i.gt(t);)n.push(i),i=i.plus(r);return n}function f(e,t,r){var n=[],i=e;if(r.gt(m))for(;i.lte(t);)n.push(i),i=i.plus(r);else if(r.lt(m))for(;i.gte(t);)n.push(i),i=i.plus(r);return n}function l(e){var t=e.split(\":\"),r=t.map(function(e){return Number(e)}),n=r.some(function(e){return isNaN(e)});if(n)return null;switch(r.length){case 2:return{start:r[0],end:r[1],step:1};case 3:return{start:r[0],end:r[2],step:r[1]};default:return null}}var p=n(r(51)),m=new e.BigNumber(0),h=new e.BigNumber(1),g=i(\"range\",{string:o,\"string, boolean\":o,\"number, number\":function(e,t){return a(s(e,t,1))},\"number, number, number\":function(e,t,r){return a(s(e,t,r))},\"number, number, boolean\":function(e,t,r){return a(r?u(e,t,1):s(e,t,1))},\"number, number, number, boolean\":function(e,t,r,n){return a(n?u(e,t,r):s(e,t,r))},\"BigNumber, BigNumber\":function(e,t){return a(c(e,t,h))},\"BigNumber, BigNumber, BigNumber\":function(e,t,r){return a(c(e,t,r))},\"BigNumber, BigNumber, boolean\":function(e,t,r){return a(r?f(e,t,h):c(e,t,h))},\"BigNumber, BigNumber, BigNumber, boolean\":function(e,t,r,n){return a(n?f(e,t,r):c(e,t,r))}});return g.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",g}t.name=\"range\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(310));return a(\"subset\",{\"...any\":function(e){try{return o.apply(null,e)}catch(t){throw i(t)}}})}var i=r(278).transform;t.name=\"subset\",t.path=\"expression.transform\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){function u(e,t){if(!t||t.isIndex!==!0)throw new TypeError(\"Index expected\");if(1!=t.size().length)throw new o(t.size().length,1);var r=e.length;a(t.min()[0],r),a(t.max()[0],r);var n=t.dimension(0),i=\"\";return n.forEach(function(t){i+=e.charAt(t)}),i}function c(e,t,r,n){if(!t||t.isIndex!==!0)throw new TypeError(\"Index expected\");if(1!=t.size().length)throw new o(t.size().length,1);if(void 0!==n){if(\"string\"!=typeof n||1!==n.length)throw new TypeError(\"Single character expected as defaultValue\")}else n=\" \";var i=t.dimension(0),s=i.size()[0];if(s!=r.length)throw new o(i.size()[0],r.length);var u=e.length;a(t.min()[0]),a(t.max()[0]);for(var c=[],f=0;u>f;f++)c[f]=e.charAt(f);if(i.forEach(function(e,t){c[e]=r.charAt(t[0])}),c.length>u)for(f=u-1,s=c.length;s>f;f++)c[f]||(c[f]=n);return c.join(\"\")}var f=n(r(51)),l=s(\"subset\",{\"Array, Index\":function(e,t){var r=f(e),n=r.subset(t);return n&&n.valueOf()},\"Matrix, Index\":function(e,t){return e.subset(t)},\"string, Index\":u,\"Array, Index, any\":function(e,t,r){return f(i(e)).subset(t,r,void 0).valueOf()},\"Array, Index, any, any\":function(e,t,r,n){return f(i(e)).subset(t,r,n).valueOf()},\"Matrix, Index, any\":function(e,t,r){return e.clone().subset(t,r)},\"Matrix, Index, any, any\":function(e,t,r,n){return e.clone().subset(t,r,n)},\"string, Index, string\":c,\"string, Index, string, string\":c});return l.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",l}var i=r(3).clone,a=r(40).validateIndex,o=r(42);t.name=\"subset\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e){if(!(this instanceof s))throw new SyntaxError(\"Constructor must be called with the new operator\");if(!e)throw new Error('Argument \"doc\" missing');this.doc=e}var u=n(r(273))();return s.prototype.type=\"Help\",s.prototype.isHelp=!0,s.prototype.toString=function(){var e=this.doc||{},t=\"\\n\";if(e.name&&(t+=\"Name: \"+e.name+\"\\n\\n\"),e.category&&(t+=\"Category: \"+e.category+\"\\n\\n\"),e.description&&(t+=\"Description:\\n    \"+e.description+\"\\n\\n\"),e.syntax&&(t+=\"Syntax:\\n    \"+e.syntax.join(\"\\n    \")+\"\\n\\n\"),e.examples){t+=\"Examples:\\n\";for(var r=0;r<e.examples.length;r++){var n=e.examples[r];t+=\"    \"+n+\"\\n\";var i;try{i=u.eval(n)}catch(o){i=o}i&&!i.isHelp&&(t+=\"        \"+a.format(i,{precision:14})+\"\\n\")}t+=\"\\n\"}return e.seealso&&(t+=\"See also: \"+e.seealso.join(\", \")+\"\\n\"),t},s.prototype.toJSON=function(){var e=i.clone(this.doc);return e.mathjs=\"Help\",e},s.fromJSON=function(e){var t={};for(var r in e)\"mathjs\"!==r&&(t[r]=e[r]);return new s(t)},s.prototype.valueOf=s.prototype.toString,s}var i=r(3),a=r(23);t.name=\"Help\",t.path=\"type\",t.factory=n},function(e,t,r){e.exports=[r(313),r(341),r(373),r(389),r(399),r(404),r(407),r(412),r(421),r(431),r(437),r(445),r(486),r(488)]},function(e,t,r){e.exports=[r(314),r(316),r(336),r(338),r(340)]},function(e,t,r){\"use strict\";function n(e,t,n,i){var o=n(r(51)),s=n(r(315)),u=n(r(52)),c=n(r(295)),f=n(r(297)),l=n(r(302)),p=n(r(63)),m=n(r(48)),h=n(r(300)),g=e.SparseMatrix,v=e.DenseMatrix,d=e.Spa,y=i(\"lup\",{DenseMatrix:function(e){return x(e)},SparseMatrix:function(e){return w(e)},Array:function(e){var t=o(e),r=x(t);return{L:r.L.valueOf(),U:r.U.valueOf(),p:r.p}}}),x=function(e){var t,r,n,i=e._size[0],o=e._size[1],h=Math.min(i,o),g=a.clone(e._data),d=[],y=[i,h],x=[],w=[h,o],b=[];for(t=0;i>t;t++)b[t]=t;for(r=0;o>r;r++){if(r>0)for(t=0;i>t;t++){var N=Math.min(t,r),E=0;for(n=0;N>n;n++)E=u(E,f(g[t][n],g[n][r]));g[t][r]=l(g[t][r],E)}var M=r,A=0,_=0;for(t=r;i>t;t++){var O=g[t][r],T=s(O);p(T,A)&&(M=t,A=T,_=O)}if(r!==M&&(b[r]=[b[M],b[M]=b[r]][0],v._swapRows(r,M,g)),i>r)for(t=r+1;i>t;t++){var C=g[t][r];m(C,0)||(g[t][r]=c(g[t][r],_))}}for(r=0;o>r;r++)for(t=0;i>t;t++)0===r&&(o>t&&(x[t]=[]),d[t]=[]),r>t?(o>t&&(x[t][r]=g[t][r]),i>r&&(d[t][r]=0)):t!==r?(o>t&&(x[t][r]=0),i>r&&(d[t][r]=g[t][r])):(o>t&&(x[t][r]=g[t][r]),i>r&&(d[t][r]=1));var S=new v({data:d,size:y}),z=new v({data:x,size:w}),B=[];for(t=0,h=b.length;h>t;t++)B[b[t]]=t;return{L:S,U:z,p:B,toString:function(){return\"L: \"+this.L.toString()+\"\\nU: \"+this.U.toString()+\"\\nP: \"+this.p}}},w=function(e){var t,r,n,i=e._size[0],a=e._size[1],o=Math.min(i,a),u=e._values,l=e._index,v=e._ptr,y=[],x=[],w=[],b=[i,o],N=[],E=[],M=[],A=[o,a],_=[],O=[];for(t=0;i>t;t++)_[t]=t,O[t]=t;var T=function(e,t){var r=O[e],n=O[t];_[r]=t,_[n]=e,O[e]=n,O[t]=r};for(r=0;a>r;r++){var C=new d;i>r&&(w.push(y.length),y.push(1),x.push(r)),M.push(N.length);var S=v[r],z=v[r+1];for(n=S;z>n;n++)t=l[n],C.set(_[t],u[n]);r>0&&C.forEach(0,r-1,function(e,t){g._forEachRow(e,y,x,w,function(r,n){r>e&&C.accumulate(r,h(f(n,t)))})});var B=r,k=C.get(r),I=s(k);C.forEach(r+1,i-1,function(e,t){var r=s(t);p(r,I)&&(B=e,I=r,k=t)}),r!==B&&(g._swapRows(r,B,b[1],y,x,w),g._swapRows(r,B,A[1],N,E,M),C.swap(r,B),T(r,B)),C.forEach(0,i-1,function(e,t){r>=e?(N.push(t),E.push(e)):(t=c(t,k),m(t,0)||(y.push(t),x.push(e)))})}return M.push(N.length),w.push(y.length),{L:new g({values:y,index:x,ptr:w,size:b}),U:new g({values:N,index:E,ptr:M,size:A}),p:_,toString:function(){return\"L: \"+this.L.toString()+\"\\nU: \"+this.U.toString()+\"\\nP: \"+this.p}}};return y}var i=r(39),a=i.object;t.name=\"lup\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"abs\",{number:Math.abs,Complex:function(e){var t=Math.abs(e.re),r=Math.abs(e.im);if(1e3>t&&1e3>r)return Math.sqrt(t*t+r*r);if(t>=r){var n=r/t;return t*Math.sqrt(1+n*n)}var i=t/r;return r*Math.sqrt(1+i*i)},BigNumber:function(e){return e.abs()},Fraction:function(e){return e.abs()},\"Array | Matrix\":function(e){return i(e,a,!0)},Unit:function(e){var t=e.clone();return t.value=Math.abs(t.value),t}});return a.toTex=\"\\\\left|${args[0]}\\\\right|\",a}var i=r(19);t.name=\"abs\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(317)),s=n(r(328)),u=i(\"slu\",{\"SparseMatrix, number, number\":function(e,t,r){if(!o(t)||0>t||t>3)throw new Error(\"Symbolic Ordering and Analysis order must be an integer number in the interval [0, 3]\");if(0>r||r>1)throw new Error(\"Partial pivoting threshold must be a number from 0 to 1\");var n=a(t,e,!1),i=s(e,n,r);return{L:i.L,U:i.U,p:i.pinv,q:n.q,toString:function(){return\"L: \"+this.L.toString()+\"\\nU: \"+this.U.toString()+\"\\np: \"+this.p.toString()+(this.q?\"\\nq: \"+this.q.toString():\"\")+\"\\n\";\n}}}});return u}var i=r(39),a=i.number,o=a.isInteger;t.name=\"slu\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(318)),a=n(r(323)),o=n(r(324)),s=n(r(325)),u=n(r(326)),c=function(e,t,r){var n,c=t._ptr,l=t._size,p=l[1],m={};if(m.q=i(e,t),e&&!m.q)return null;if(r){var h=e?a(t,null,m.q,0):t;m.parent=o(h,1);var g=s(m.parent,p);if(m.cp=u(h,m.parent,g,1),h&&m.parent&&m.cp&&f(h,m))for(m.unz=0,n=0;p>n;n++)m.unz+=m.cp[n]}else m.unz=4*c[p]+p,m.lnz=m.unz;return m},f=function(e,t){var r=e._ptr,n=e._index,i=e._size,a=i[0],o=i[1];t.pinv=[],t.leftmost=[];var s,u,c,f,l,p=t.parent,m=t.pinv,h=t.leftmost,g=[],v=0,d=a,y=a+o,x=a+2*o;for(u=0;o>u;u++)g[d+u]=-1,g[y+u]=-1,g[x+u]=0;for(s=0;a>s;s++)h[s]=-1;for(u=o-1;u>=0;u--)for(f=r[u],l=r[u+1],c=f;l>c;c++)h[n[c]]=u;for(s=a-1;s>=0;s--)m[s]=-1,u=h[s],-1!=u&&(0===g[x+u]++&&(g[y+u]=s),g[v+s]=g[d+u],g[d+u]=s);for(t.lnz=0,t.m2=a,u=0;o>u;u++)if(s=g[d+u],t.lnz++,0>s&&(s=t.m2++),m[s]=u,!(--x[u]<=0)){t.lnz+=g[x+u];var w=p[u];-1!=w&&(0===g[x+w]&&(g[y+w]=g[y+u]),g[v+g[y+u]]=g[d+w],g[d+w]=g[v+s],g[x+w]+=g[x+u])}for(s=0;a>s;s++)m[s]<0&&(m[s]=u++);return!0};return c}t.name=\"cs_sqr\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(319)),a=n(r(320)),o=n(r(321)),s=n(r(50)),u=n(r(296)),c=n(r(322)),f=function(e,t){if(!t||0>=e||e>3)return null;var r=t._size,n=r[0],s=r[1],u=0,c=Math.max(16,10*Math.sqrt(s));c=Math.min(s-2,c);var f=l(e,t,n,s,c);a(f,g,null);for(var v,d,y,x,w,b,N,E,M,A,_,O,T,C,S,z,B=f._index,k=f._ptr,I=k[s],R=[],P=[],U=0,q=s+1,L=2*(s+1),F=3*(s+1),D=4*(s+1),$=5*(s+1),j=6*(s+1),G=7*(s+1),H=R,Z=p(s,k,P,U,F,H,L,G,q,j,D,$),V=m(s,k,P,$,D,j,c,q,F,H,L),Y=0;s>V;){for(y=-1;s>Y&&-1==(y=P[F+Y]);Y++);-1!=P[L+y]&&(H[P[L+y]]=-1),P[F+Y]=P[L+y];var W=P[D+y],X=P[q+y];V+=X;var J=0;P[q+y]=-X;var K=k[y],Q=0===W?K:I,ee=Q;for(x=1;W+1>=x;x++){for(x>W?(b=y,N=K,E=P[U+y]-W):(b=B[K++],N=k[b],E=P[U+b]),w=1;E>=w;w++)v=B[N++],(M=P[q+v])<=0||(J+=M,P[q+v]=-M,B[ee++]=v,-1!=P[L+v]&&(H[P[L+v]]=H[v]),-1!=H[v]?P[L+H[v]]=P[L+v]:P[F+P[$+v]]=P[L+v]);b!=y&&(k[b]=i(y),P[j+b]=0)}for(0!==W&&(I=ee),P[$+y]=J,k[y]=Q,P[U+y]=ee-Q,P[D+y]=-2,Z=h(Z,u,j,s),A=Q;ee>A;A++)if(v=B[A],!((_=P[D+v])<=0)){M=-P[q+v];var te=Z-M;for(K=k[v],O=k[v]+_-1;O>=K;K++)b=B[K],P[j+b]>=Z?P[j+b]-=M:0!==P[j+b]&&(P[j+b]=P[$+b]+te)}for(A=Q;ee>A;A++){for(v=B[A],O=k[v],T=O+P[D+v]-1,C=O,S=0,z=0,K=O;T>=K;K++)if(b=B[K],0!==P[j+b]){var re=P[j+b]-Z;re>0?(z+=re,B[C++]=b,S+=b):(k[b]=i(y),P[j+b]=0)}P[D+v]=C-O+1;var ne=C,ie=O+P[U+v];for(K=T+1;ie>K;K++){d=B[K];var ae=P[q+d];0>=ae||(z+=ae,B[C++]=d,S+=d)}0===z?(k[v]=i(y),M=-P[q+v],J-=M,X+=M,V+=M,P[q+v]=0,P[D+v]=-1):(P[$+v]=Math.min(P[$+v],z),B[C]=B[ne],B[ne]=B[O],B[O]=y,P[U+v]=C-O+1,S=(0>S?-S:S)%s,P[L+v]=P[G+S],P[G+S]=v,H[v]=S)}for(P[$+y]=J,u=Math.max(u,J),Z=h(Z+u,u,j,s),A=Q;ee>A;A++)if(v=B[A],!(P[q+v]>=0))for(S=H[v],v=P[G+S],P[G+S]=-1;-1!=v&&-1!=P[L+v];v=P[L+v],Z++){for(E=P[U+v],_=P[D+v],K=k[v]+1;K<=k[v]+E-1;K++)P[j+B[K]]=Z;var oe=v;for(d=P[L+v];-1!=d;){var se=P[U+d]===E&&P[D+d]===_;for(K=k[d]+1;se&&K<=k[d]+E-1;K++)P[j+B[K]]!=Z&&(se=0);se?(k[d]=i(v),P[q+v]+=P[q+d],P[q+d]=0,P[D+d]=-1,d=P[L+d],P[L+oe]=d):(oe=d,d=P[L+d])}}for(K=Q,A=Q;ee>A;A++)v=B[A],(M=-P[q+v])<=0||(P[q+v]=M,z=P[$+v]+J-M,z=Math.min(z,s-V-M),-1!=P[F+z]&&(H[P[F+z]]=v),P[L+v]=P[F+z],H[v]=-1,P[F+z]=v,Y=Math.min(Y,z),P[$+v]=z,B[K++]=v);P[q+y]=X,0===(P[U+y]=K-Q)&&(k[y]=-1,P[j+y]=0),0!==W&&(I=K)}for(v=0;s>v;v++)k[v]=i(k[v]);for(d=0;s>=d;d++)P[F+d]=-1;for(d=s;d>=0;d--)P[q+d]>0||(P[L+d]=P[F+k[d]],P[F+k[d]]=d);for(b=s;b>=0;b--)P[q+b]<=0||-1!=k[b]&&(P[L+b]=P[F+k[b]],P[F+k[b]]=b);for(y=0,v=0;s>=v;v++)-1==k[v]&&(y=o(v,y,P,F,L,R,j));return R.splice(R.length-1,1),R},l=function(e,t,r,n,i){var a=c(t);if(1===e&&n===r)return s(t,a);if(2==e){for(var o=a._index,f=a._ptr,l=0,p=0;r>p;p++){var m=f[p];if(f[p]=l,!(f[p+1]-m>i))for(var h=f[p+1];h>m;m++)o[l++]=o[m]}return f[r]=l,t=c(a),u(a,t)}return u(a,t)},p=function(e,t,r,n,i,a,o,s,u,c,f,l){for(var p=0;e>p;p++)r[n+p]=t[p+1]-t[p];r[n+e]=0;for(var m=0;e>=m;m++)r[i+m]=-1,a[m]=-1,r[o+m]=-1,r[s+m]=-1,r[u+m]=1,r[c+m]=1,r[f+m]=0,r[l+m]=r[n+m];var g=h(0,0,c,e);return r[f+e]=-2,t[e]=-1,r[c+e]=0,g},m=function(e,t,r,n,a,o,s,u,c,f,l){for(var p=0,m=0;e>m;m++){var h=r[n+m];if(0===h)r[a+m]=-2,p++,t[m]=-1,r[o+m]=0;else if(h>s)r[u+m]=0,r[a+m]=-1,p++,t[m]=i(e),r[u+e]++;else{var g=r[c+h];-1!=g&&(f[g]=m),r[l+m]=r[c+h],r[c+h]=m}}return p},h=function(e,t,r,n){if(2>e||0>e+t){for(var i=0;n>i;i++)0!==r[i]&&(r[i]=1);e=2}return e},g=function(e,t){return e!=t};return f}t.name=\"cs_amd\",t.path=\"sparse\",t.factory=n},function(e,t){\"use strict\";function r(){var e=function(e){return-e-2};return e}t.name=\"cs_flip\",t.path=\"sparse\",t.factory=r},function(e,t){\"use strict\";function r(){var e=function(e,t,r){for(var n=e._values,i=e._index,a=e._ptr,o=e._size,s=o[1],u=0,c=0;s>c;c++){var f=a[c];for(a[c]=u;f<a[c+1];f++)t(i[f],c,n?n[f]:1,r)&&(i[u]=i[f],n&&(n[u]=n[f]),u++)}return a[s]=u,i.splice(u,i.length-u),n&&n.splice(u,n.length-u),u};return e}t.name=\"cs_fkeep\",t.path=\"sparse\",t.factory=r},function(e,t){\"use strict\";function r(){var e=function(e,t,r,n,i,a,o){var s=0;for(r[o]=e;s>=0;){var u=r[o+s],c=r[n+u];-1==c?(s--,a[t++]=u):(r[n+u]=r[i+c],++s,r[o+s]=c)}return t};return e}t.name=\"cs_tdfs\",t.path=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=e.DenseMatrix,f=e.SparseMatrix,l=o(\"transpose\",{Array:function(e){return l(u(e)).valueOf()},Matrix:function(e){var t,r=e.size();switch(r.length){case 1:t=e.clone();break;case 2:var n=r[0],i=r[1];if(0===i)throw new RangeError(\"Cannot transpose a 2D matrix with no columns (size: \"+a(r)+\")\");switch(e.storage()){case\"dense\":t=p(e,n,i);break;case\"sparse\":t=m(e,n,i)}break;default:throw new RangeError(\"Matrix must be a vector or two dimensional (size: \"+a(this._size)+\")\")}return t},any:function(e){return i(e)}}),p=function(e,t,r){for(var n,a=e._data,o=[],s=0;r>s;s++){n=o[s]=[];for(var u=0;t>u;u++)n[u]=i(a[u][s])}return new c({data:o,size:[r,t],datatype:e._datatype})},m=function(e,t,r){for(var n=e._values,a=e._index,o=e._ptr,s=n?[]:void 0,u=[],c=[],l=[],p=0;t>p;p++)l[p]=0;var m,h,g;for(m=0,h=a.length;h>m;m++)l[a[m]]++;for(var v=0,d=0;t>d;d++)c.push(v),v+=l[d],l[d]=c[d];for(c.push(v),g=0;r>g;g++)for(var y=o[g],x=o[g+1],w=y;x>w;w++){var b=l[a[w]]++;u[b]=g,n&&(s[b]=i(n[w]))}return new f({values:s,index:u,ptr:c,size:[r,t],datatype:e._datatype})};return l.toTex=\"\\\\left(${args[0]}\\\\right)\"+s.operators.transpose,l}var i=r(3).clone,a=r(23).format;t.name=\"transpose\",t.factory=n},function(e,t){\"use strict\";function r(e){var t=e.SparseMatrix,r=function(e,r,n,i){for(var a=e._values,o=e._index,s=e._ptr,u=e._size,c=e._datatype,f=u[0],l=u[1],p=i&&e._values?[]:null,m=[],h=[],g=0,v=0;l>v;v++){h[v]=g;for(var d=n?n[v]:v,y=s[d],x=s[d+1],w=y;x>w;w++){var b=r?r[o[w]]:o[w];m[g]=b,p&&(p[g]=a[w]),g++}}return h[l]=g,new t({values:p,index:m,ptr:h,size:[f,l],datatype:c})};return r}t.name=\"cs_permute\",t.path=\"sparse\",t.factory=r},function(e,t){\"use strict\";function r(){var e=function(e,t){if(!e)return null;var r,n,i=e._index,a=e._ptr,o=e._size,s=o[0],u=o[1],c=[],f=[],l=0,p=u;if(t)for(r=0;s>r;r++)f[p+r]=-1;for(var m=0;u>m;m++){c[m]=-1,f[l+m]=-1;for(var h=a[m],g=a[m+1],v=h;g>v;v++){var d=i[v];for(r=t?f[p+d]:d;-1!=r&&m>r;r=n)n=f[l+r],f[l+r]=m,-1==n&&(c[r]=m);t&&(f[p+d]=m)}}return c};return e}t.name=\"cs_etree\",t.path=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(321)),a=function(e,t){if(!e)return null;var r,n=0,a=[],o=[],s=0,u=t,c=2*t;for(r=0;t>r;r++)o[s+r]=-1;for(r=t-1;r>=0;r--)-1!=e[r]&&(o[u+r]=o[s+e[r]],o[s+e[r]]=r);for(r=0;t>r;r++)-1==e[r]&&(n=i(r,n,o,s,u,a,c));return a};return a}t.name=\"cs_post\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(322)),a=n(r(327)),o=function(e,t,r,n){if(!e||!t||!r)return null;var o,s,u,c,f,l,p,m=e._size,h=m[0],g=m[1],v=4*g+(n?g+h+1:0),d=[],y=0,x=g,w=2*g,b=3*g,N=4*g,E=5*g+1;for(u=0;v>u;u++)d[u]=-1;var M=[],A=i(e),_=A._index,O=A._ptr;for(u=0;g>u;u++)for(s=r[u],M[s]=-1==d[b+s]?1:0;-1!=s&&-1==d[b+s];s=t[s])d[b+s]=u;if(n){for(u=0;g>u;u++)d[r[u]]=u;for(o=0;h>o;o++){for(u=g,l=O[o],p=O[o+1],f=l;p>f;f++)u=Math.min(u,d[_[f]]);d[E+o]=d[N+u],d[N+u]=o}}for(o=0;g>o;o++)d[y+o]=o;for(u=0;g>u;u++){for(s=r[u],-1!=t[s]&&M[t[s]]--,c=n?d[N+u]:s;-1!=c;c=n?d[E+c]:-1)for(f=O[c];f<O[c+1];f++){o=_[f];var T=a(o,s,d,b,x,w,y);T.jleaf>=1&&M[s]++,2==T.jleaf&&M[T.q]--}-1!=t[s]&&(d[y+s]=t[s])}for(s=0;g>s;s++)-1!=t[s]&&(M[t[s]]+=M[s]);return M};return o}t.name=\"cs_counts\",t.path=\"sparse\",t.factory=n},function(e,t){\"use strict\";function r(){var e=function(e,t,r,n,i,a,o){var s,u,c,f,l=0;if(t>=e||r[n+t]<=r[i+e])return-1;if(r[i+e]=r[n+t],c=r[a+e],r[a+e]=t,-1===c)l=1,f=e;else{for(l=2,f=c;f!=r[o+f];f=r[o+f]);for(s=c;s!=f;s=u)u=r[o+s],r[o+s]=f}return{jleaf:l,q:f}};return e}t.name=\"cs_leaf\",t.path=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(315)),a=n(r(295)),o=n(r(296)),s=n(r(63)),u=n(r(329)),c=n(r(330)),f=e.SparseMatrix,l=function(e,t,r){if(!e)return null;var n,l=e._size,p=l[1],m=100,h=100;t&&(n=t.q,m=t.lnz||m,h=t.unz||h);var g,v,d=[],y=[],x=[],w=new f({values:d,index:y,ptr:x,size:[p,p]}),b=[],N=[],E=[],M=new f({values:b,index:N,ptr:E,size:[p,p]}),A=[],_=[],O=[];for(g=0;p>g;g++)_[g]=0,A[g]=-1,x[g+1]=0;m=0,h=0;for(var T=0;p>T;T++){x[T]=m,E[T]=h;var C=n?n[T]:T,S=c(w,e,C,O,_,A,1),z=-1,B=-1;for(v=S;p>v;v++)if(g=O[v],A[g]<0){var k=i(_[g]);s(k,B)&&(B=k,z=g)}else N[h]=A[g],b[h++]=_[g];if(-1==z||0>=B)return null;A[C]<0&&u(i(_[C]),o(B,r))&&(z=C);var I=_[z];for(N[h]=T,b[h++]=I,A[z]=T,y[m]=z,d[m++]=1,v=S;p>v;v++)g=O[v],A[g]<0&&(y[m]=g,d[m++]=a(_[g],I)),_[g]=0}for(x[p]=m,E[p]=h,v=0;m>v;v++)y[v]=A[y[v]];return d.splice(m,d.length-m),y.splice(m,y.length-m),b.splice(h,b.length-h),N.splice(h,N.length-h),{L:w,U:M,pinv:A}};return l}t.name=\"cs_lu\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=a(\"largerEq\",{\"boolean, boolean\":function(e,t){return e>=t},\"number, number\":function(e,r){return e>=r||i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return e.gte(t)},\"Fraction, Fraction\":function(e,t){return-1!==e.compare(t)},\"Complex, Complex\":function(){throw new TypeError(\"No ordering relation is defined for complex numbers\")},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value>=r.value||i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return e>=t},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,m);break;default:r=s(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,m,!1);break;default:r=f(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(o(e),t)},\"Matrix, Array\":function(e,t){return m(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,m,!1);break;default:r=l(e,t,m,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,m,!0);break;default:r=l(t,e,m,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,m,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,m,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.largerEq+\"${args[1]}\\\\right)\",m}var i=r(6).nearlyEqual;t.name=\"largerEq\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(295)),a=n(r(296)),o=n(r(302)),s=n(r(331)),u=function(e,t,r,n,u,c,f){var l,p,m,h,g=e._values,v=e._index,d=e._ptr,y=e._size,x=y[1],w=t._values,b=t._index,N=t._ptr,E=s(e,t,r,n,c);for(l=E;x>l;l++)u[n[l]]=0;for(p=N[r],m=N[r+1],l=p;m>l;l++)u[b[l]]=w[l];for(var M=E;x>M;M++){var A=n[M],_=c?c[A]:A;if(!(0>_))for(p=d[_],m=d[_+1],u[A]=i(u[A],g[f?p:m-1]),l=f?p+1:p,h=f?m:m-1;h>l;l++){var O=v[l];u[O]=o(u[O],a(g[l],u[A]))}}return E};return u}t.name=\"cs_spsolve\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(332)),a=n(r(333)),o=n(r(334)),s=function(e,t,r,n,s){var u,c,f,l=e._ptr,p=e._size,m=t._index,h=t._ptr,g=p[1],v=g;for(c=h[r],f=h[r+1],u=c;f>u;u++){var d=m[u];a(l,d)||(v=i(d,e,v,n,s))}for(u=v;g>u;u++)o(l,n[u]);return v};return s}t.name=\"cs_reach\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(333)),a=n(r(334)),o=n(r(335)),s=function(e,t,r,n,s){var u,c,f,l=t._index,p=t._ptr,m=t._size,h=m[1],g=0;for(n[0]=e;g>=0;){e=n[g];var v=s?s[e]:e;i(p,e)||(a(p,e),n[h+g]=0>v?0:o(p[v]));var d=1;for(c=n[h+g],f=0>v?0:o(p[v+1]);f>c;c++)if(u=l[c],!i(p,u)){n[h+g]=c,n[++g]=u,d=0;break}d&&(g--,n[--r]=e)}return r};return s}t.name=\"cs_dfs\",t.path=\"sparse\",t.factory=n},function(e,t){\"use strict\";function r(){var e=function(e,t){return e[t]<0};return e}t.name=\"cs_marked\",t.path=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(319)),a=function(e,t){e[t]=i(e[t])};return a}t.name=\"cs_mark\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n){var i=n(r(319)),a=function(e){return 0>e?i(e):e};return a}t.name=\"cs_unflip\",t.path=\"sparse\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(295)),s=n(r(297)),u=n(r(302)),c=n(r(48)),f=n(r(337)),l=e.DenseMatrix,p=i(\"lsolve\",{\"SparseMatrix, Array | Matrix\":function(e,t){return h(e,t)},\"DenseMatrix, Array | Matrix\":function(e,t){return m(e,t)},\"Array, Array | Matrix\":function(e,t){var r=a(e),n=m(r,t);return n.valueOf()}}),m=function(e,t){t=f(e,t,!0);for(var r=t._data,n=e._size[0],i=e._size[1],a=[],p=e._data,m=0;i>m;m++){var h,g=r[m][0]||0;if(c(g,0))h=0;else{var v=p[m][m];if(c(v,0))throw new Error(\"Linear system cannot be solved since matrix is singular\");h=o(g,v);for(var d=m+1;n>d;d++)r[d]=[u(r[d][0]||0,s(h,p[d][m]))]}a[m]=[h]}return new l({data:a,size:[n,1]})},h=function(e,t){t=f(e,t,!0);for(var r,n,i=t._data,a=e._size[0],p=e._size[1],m=e._values,h=e._index,g=e._ptr,v=[],d=0;p>d;d++){var y=i[d][0]||0;if(c(y,0))v[d]=[0];else{var x=0,w=[],b=[],N=g[d+1];for(n=g[d];N>n;n++)r=h[n],r===d?x=m[n]:r>d&&(w.push(m[n]),b.push(r));if(c(x,0))throw new Error(\"Linear system cannot be solved since matrix is singular\");var E=o(y,x);for(n=0,N=b.length;N>n;n++)r=b[n],i[r]=[u(i[r][0]||0,s(E,w[n]))];v[d]=[E]}}return new l({data:v,size:[a,1]})};return p}t.name=\"lsolve\",t.factory=n},function(e,t,r){\"use strict\";function n(e){var t=e.DenseMatrix,r=function(e,r,n){var i=e.size();if(2!==i.length)throw new RangeError(\"Matrix must be two dimensional (size: \"+a.format(i)+\")\");var u=i[0],c=i[1];if(u!==c)throw new RangeError(\"Matrix must be square (size: \"+a.format(i)+\")\");var f,l,p;if(r&&r.isMatrix===!0){var m=r.size();if(1===m.length){if(m[0]!==u)throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\");for(f=[],p=r._data,l=0;u>l;l++)f[l]=[p[l]];return new t({data:f,size:[u,1],datatype:r._datatype})}if(2===m.length){if(m[0]!==u||1!==m[1])throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\");if(r.isDenseMatrix===!0){if(n){for(f=[],p=r._data,l=0;u>l;l++)f[l]=[p[l][0]];return new t({data:f,size:[u,1],datatype:r._datatype})}return r}for(f=[],l=0;u>l;l++)f[l]=[0];for(var h=r._values,g=r._index,v=r._ptr,d=v[1],y=v[0];d>y;y++)l=g[y],f[l][0]=h[y];return new t({data:f,size:[u,1],datatype:r._datatype})}throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\")}if(s(r)){var x=o.size(r);if(1===x.length){if(x[0]!==u)throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\");for(f=[],l=0;u>l;l++)f[l]=[r[l]];return new t({data:f,size:[u,1]})}if(2===x.length){if(x[0]!==u||1!==x[1])throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\");for(f=[],l=0;u>l;l++)f[l]=[r[l][0]];return new t({data:f,size:[u,1]})}throw new RangeError(\"Dimension mismatch. Matrix columns must match vector length.\")}};return r}var i=r(39),a=i.string,o=i.array,s=Array.isArray;t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(314)),u=n(r(316)),c=n(r(339)),f=n(r(337)),l=n(r(340)),p=n(r(336)),m=a(\"lusolve\",{\"Array, Array | Matrix\":function(e,t){e=o(e);var r=s(e),n=g(r.L,r.U,r.p,null,t);return n.valueOf()},\"DenseMatrix, Array | Matrix\":function(e,t){var r=s(e);return g(r.L,r.U,r.p,null,t)},\"SparseMatrix, Array | Matrix\":function(e,t){var r=s(e);return g(r.L,r.U,r.p,null,t)},\"SparseMatrix, Array | Matrix, number, number\":function(e,t,r,n){var i=u(e,r,n);return g(i.L,i.U,i.p,i.q,t)},\"Object, Array | Matrix\":function(e,t){return g(e.L,e.U,e.p,e.q,t)}}),h=function(e){if(e&&e.isMatrix===!0)return e;if(i(e))return o(e);throw new TypeError(\"Invalid Matrix LU decomposition\")},g=function(e,t,r,n,i){e=h(e),t=h(t),i=f(e,i,!1),r&&(i._data=c(r,i._data));var a=p(e,i),o=l(t,a);return n&&(o._data=c(n,o._data)),o};return m}var i=Array.isArray;t.name=\"lusolve\",t.factory=n},function(e,t){\"use strict\";function r(){var e=function(e,t,r){var n,r=t.length,i=[];if(e)for(n=0;r>n;n++)i[e[n]]=t[n];else for(n=0;r>n;n++)i[n]=t[n];return i};return e}t.name=\"cs_ipvec\",t.path=\"sparse\",t.factory=r},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(295)),s=n(r(297)),u=n(r(302)),c=n(r(48)),f=n(r(337)),l=e.DenseMatrix,p=i(\"usolve\",{\"SparseMatrix, Array | Matrix\":function(e,t){return h(e,t)},\"DenseMatrix, Array | Matrix\":function(e,t){return m(e,t)},\"Array, Array | Matrix\":function(e,t){var r=a(e),n=m(r,t);return n.valueOf()}}),m=function(e,t){t=f(e,t,!0);for(var r=t._data,n=e._size[0],i=e._size[1],a=[],p=e._data,m=i-1;m>=0;m--){var h,g=r[m][0]||0;if(c(g,0))h=0;else{var v=p[m][m];if(c(v,0))throw new Error(\"Linear system cannot be solved since matrix is singular\");h=o(g,v);for(var d=m-1;d>=0;d--)r[d]=[u(r[d][0]||0,s(h,p[d][m]))]}a[m]=[h]}return new l({data:a,size:[n,1]})},h=function(e,t){t=f(e,t,!0);for(var r,n,i=t._data,a=e._size[0],p=e._size[1],m=e._values,h=e._index,g=e._ptr,v=[],d=p-1;d>=0;d--){var y=i[d][0]||0;if(c(y,0))v[d]=[0];else{var x=0,w=[],b=[],N=g[d],E=g[d+1];for(n=E-1;n>=N;n--)r=h[n],r===d?x=m[n]:d>r&&(w.push(m[n]),b.push(r));if(c(x,0))throw new Error(\"Linear system cannot be solved since matrix is singular\");var M=o(y,x);for(n=0,E=b.length;E>n;n++)r=b[n],i[r]=[u(i[r][0],s(M,w[n]))];v[d]=[M]}}return new l({data:v,size:[a,1]})};return p}t.name=\"usolve\",t.factory=n},function(e,t,r){e.exports=[r(315),r(50),r(52),r(342),r(344),r(345),r(294),r(346),r(348),r(350),r(343),r(353),r(354),r(355),r(356),r(359),r(352),r(362),r(363),r(296),r(364),r(366),r(351),r(367),r(369),r(357),r(370),r(302),r(300),r(371),r(372)]},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){if(0===e)return e;var t,r=0>e;return r&&(e=-e),isFinite(e)?(t=Math.exp(Math.log(e)/3),t=(e/(t*t)+2*t)/3):t=e,r?-t:t}function s(r,n){var i=r.toPolar(),a=l(new e.Complex(o(i.r),0),p(new e.Complex(0,i.phi/3)));if(n){var s=[a,l(new e.Complex(o(i.r),0),p(new e.Complex(0,i.phi/3+2*Math.PI/3))),l(new e.Complex(o(i.r),0),p(new e.Complex(0,i.phi/3-2*Math.PI/3)))];return\"array\"===t.matrix?s:f(s)}return a}function u(e){if(e.isZero())return e;var t,r=e.isNegative();return r&&(e=e.neg()),e.isFinite()?(t=e.ln().div(3).exp(),t=e.div(t.times(t)).plus(t.times(2)).div(3)):t=1/0,r?t.neg():t}function c(e){var t=e.value<0;t&&(e.value=-e.value);var r=e.pow(1/3);return t&&(r.value=-r.value),r}var f=n(r(51)),l=a.find(n(r(297)),[\"Complex,Complex\"]),p=a.find(n(r(343)),[\"Complex\"]),m=a(\"cbrt\",{number:o,Complex:s,\"Complex, boolean\":s,BigNumber:u,Unit:c,\"Array | Matrix\":function(e){return i(e,m,!0)}});return m.toTex=\"\\\\sqrt[3]{${args[0]}}\",m}var i=r(19);t.name=\"cbrt\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"exp\",{number:Math.exp,Complex:function(t){var r=Math.exp(t.re);return new e.Complex(r*Math.cos(t.im),r*Math.sin(t.im))},BigNumber:function(e){return e.exp()},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex=\"\\\\exp\\\\left(${args[0]}\\\\right)\",a}var i=r(19);t.name=\"exp\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"ceil\",{number:Math.ceil,Complex:function(t){return new e.Complex(Math.ceil(t.re),Math.ceil(t.im))},BigNumber:function(e){return e.ceil()},Fraction:function(e){return e.ceil()},\"Array | Matrix\":function(e){return i(e,a,!0)}});return a.toTex=\"\\\\left\\\\lceil${args[0]}\\\\right\\\\rceil\",a}var i=r(19);t.name=\"ceil\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=a.find(n(r(297)),[\"Complex,Complex\"]),s=a(\"cube\",{number:function(e){return e*e*e},Complex:function(e){return o(o(e,e),e)},BigNumber:function(e){return e.times(e).times(e)},Fraction:function(e){return e.mul(e).mul(e)},\"Array | Matrix\":function(e){return i(e,s,!0)},Unit:function(e){return e.pow(3)}});return s.toTex=\"\\\\left(${args[0]}\\\\right)^3\",s}var i=r(19);t.name=\"cube\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(295)),s=r(30),u=n(r(347)),c=n(r(60)),f=n(r(61)),l=n(r(298)),p=n(r(62)),m=n(r(56)),h=n(r(57)),g=i(\"dotDivide\",{\"any, any\":o,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,o,!1);break;default:r=u(t,e,o,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,o,!1);break;default:r=m(e,t,o)}}return r},\"Array, Array\":function(e,t){return g(a(e),a(t)).valueOf()},\"Array, Matrix\":function(e,t){return g(a(e),t)},\"Matrix, Array\":function(e,t){return g(e,a(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,o,!1);break;default:r=h(e,t,o,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=p(t,e,o,!0);break;default:r=h(t,e,o,!0)}return r},\"Array, any\":function(e,t){return h(a(e),t,o,!1).valueOf()},\"any, Array\":function(e,t){return h(a(t),e,o,!0).valueOf()}});return g.toTex=\"\\\\left(${args[0]}\"+s.operators.dotDivide+\"${args[1]}\\\\right)\",g}t.name=\"dotDivide\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(48)),s=e.SparseMatrix,u=function(e,t,r,n){var u=e._data,c=e._size,f=e._datatype,l=t._values,p=t._index,m=t._ptr,h=t._size,g=t._datatype;if(c.length!==h.length)throw new i(c.length,h.length);if(c[0]!==h[0]||c[1]!==h[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+c+\") must match Matrix B (\"+h+\")\");if(!l)throw new Error(\"Cannot perform operation on Dense Matrix and Pattern Sparse Matrix\");var v,d=c[0],y=c[1],x=o,w=0,b=r;\"string\"==typeof f&&f===g&&(v=f,x=a.find(o,[v,v]),w=a.convert(0,v),b=a.find(r,[v,v]));for(var N=[],E=[],M=[],A=0;y>A;A++){M[A]=E.length;for(var _=m[A],O=m[A+1],T=_;O>T;T++){var C=p[T],S=n?b(l[T],u[C][A]):b(u[C][A],l[T]);x(S,w)||(E.push(C),N.push(S))}}return M[y]=E.length,new s({values:N,index:E,ptr:M,size:[d,y],datatype:v})};return u}var i=r(42);t.name=\"algorithm02\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(297)),s=r(30),u=n(r(347)),c=n(r(349)),f=n(r(298)),l=n(r(56)),p=n(r(57)),m=i(\"dotMultiply\",{\"any, any\":o,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=c(e,t,o,!1);break;default:r=u(t,e,o,!0)}break;default:switch(t.storage()){case\"sparse\":r=u(e,t,o,!1);break;default:r=l(e,t,o)}}return r},\"Array, Array\":function(e,t){return m(a(e),a(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(a(e),t)},\"Matrix, Array\":function(e,t){return m(e,a(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,o,!1);break;default:r=p(e,t,o,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=f(t,e,o,!0);break;default:r=p(t,e,o,!0)}return r},\"Array, any\":function(e,t){return p(a(e),t,o,!1).valueOf()},\"any, Array\":function(e,t){return p(a(t),e,o,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+s.operators.dotMultiply+\"${args[1]}\\\\right)\",m}t.name=\"dotMultiply\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(48)),s=e.SparseMatrix,u=function(e,t,r){var n=e._values,u=e._index,c=e._ptr,f=e._size,l=e._datatype,p=t._values,m=t._index,h=t._ptr,g=t._size,v=t._datatype;if(f.length!==g.length)throw new i(f.length,g.length);if(f[0]!==g[0]||f[1]!==g[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+f+\") must match Matrix B (\"+g+\")\");var d,y=f[0],x=f[1],w=o,b=0,N=r;\"string\"==typeof l&&l===v&&(d=l,w=a.find(o,[d,d]),b=a.convert(0,d),N=a.find(r,[d,d]));var E,M,A,_,O,T=n&&p?[]:void 0,C=[],S=[],z=new s({values:T,index:C,ptr:S,size:[y,x],datatype:d}),B=T?[]:void 0,k=[];for(M=0;x>M;M++){S[M]=C.length;var I=M+1;if(B)for(_=h[M],O=h[M+1],A=_;O>A;A++)E=m[A],k[E]=I,B[E]=p[A];for(_=c[M],O=c[M+1],A=_;O>A;A++)if(E=u[A],B){var R=k[E]===I?B[E]:b,P=N(n[A],R);w(P,b)||(C.push(E),T.push(P))}else C.push(E)}return S[x]=C.length,z};return u}var i=r(42);t.name=\"algorithm09\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(351)),s=r(30),u=n(r(60)),c=n(r(61)),f=n(r(298)),l=n(r(62)),p=n(r(56)),m=n(r(57)),h=i(\"dotPow\",{\"any, any\":o,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=c(e,t,o,!1);break;default:r=u(t,e,o,!0)}break;default:switch(t.storage()){case\"sparse\":r=u(e,t,o,!1);break;default:r=p(e,t,o)}}return r},\"Array, Array\":function(e,t){return h(a(e),a(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(a(e),t)},\"Matrix, Array\":function(e,t){return h(e,a(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, any\":function(e,t){return m(a(e),t,h,!1).valueOf()},\"any, Array\":function(e,t){return m(a(t),e,h,!0).valueOf()}});return h.toTex=\"\\\\left(${args[0]}\"+s.operators.dotPow+\"${args[1]}\\\\right)\",h}t.name=\"dotPow\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(r,n){return i(n)||r>=0||t.predictable?Math.pow(r,n):u(new e.Complex(r,0),new e.Complex(n,0))}function u(e,t){return p(g(h(e),t))}function c(e,t){if(!i(t)||0>t)throw new TypeError(\"For A^b, b must be a positive integer (value is \"+t+\")\");var r=a(e);if(2!=r.length)throw new Error(\"For A^b, A must be 2 dimensional (A has \"+r.length+\" dimensions)\");if(r[0]!=r[1])throw new Error(\"For A^b, A must be square (size is \"+r[0]+\"x\"+r[1]+\")\");for(var n=m(r[0]).valueOf(),o=e;t>=1;)1==(1&t)&&(n=g(o,n)),t>>=1,o=g(o,o);return n}function f(e,t){return v(c(e.valueOf(),t))}var l=r(30),p=n(r(343)),m=n(r(304)),h=n(r(352)),g=n(r(296)),v=n(r(51)),d=o(\"pow\",{\"number, number\":s,\"Complex, Complex\":u,\"BigNumber, BigNumber\":function(r,n){return n.isInteger()||r>=0||t.predictable?r.pow(n):u(new e.Complex(r.toNumber(),0),new e.Complex(n.toNumber(),0))},\"Fraction, Fraction\":function(e,r){if(1!==r.d){if(t.predictable)throw new Error(\"Function pow does not support non-integer exponents for fractions.\");return s(e.valueOf(),r.valueOf())}return e.pow(r)},\"Array, number\":c,\"Array, BigNumber\":function(e,t){return c(e,t.toNumber())},\"Matrix, number\":f,\"Matrix, BigNumber\":function(e,t){return f(e,t.toNumber())},\"Unit, number\":function(e,t){return e.pow(t)}});return d.toTex=\"\\\\left(${args[0]}\\\\right)\"+l.operators.pow+\"{${args[1]}}\",d}var i=r(6).isInteger,a=r(40).size;t.name=\"pow\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(r){return r>=0||t.predictable?Math.log(r):c(new e.Complex(r,0))}function s(t){return new e.Complex(Math.log(Math.sqrt(t.re*t.re+t.im*t.im)),Math.atan2(t.im,t.re))}var u=n(r(295)),c=a(\"log\",{number:o,Complex:s,BigNumber:function(r){return!r.isNegative()||t.predictable?r.ln():s(new e.Complex(r.toNumber(),0))},\"Array | Matrix\":function(e){return i(e,c)},\"any, any\":function(e,t){return u(c(e),c(t))}});return c.toTex={1:\"\\\\ln\\\\left(${args[0]}\\\\right)\",2:\"\\\\log_{${args[1]}}\\\\left(${args[0]}\\\\right)\"},c}var i=r(19);t.name=\"log\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"fix\",{number:function(e){return e>0?Math.floor(e):Math.ceil(e)},Complex:function(t){return new e.Complex(t.re>0?Math.floor(t.re):Math.ceil(t.re),t.im>0?Math.floor(t.im):Math.ceil(t.im))},BigNumber:function(e){return e.isNegative()?e.ceil():e.floor()},Fraction:function(e){return e.s<0?e.ceil():e.floor()},\"Array | Matrix\":function(e){return i(e,a,!0)}});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}var i=r(19);t.name=\"fix\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"floor\",{number:Math.floor,Complex:function(t){return new e.Complex(Math.floor(t.re),Math.floor(t.im))},BigNumber:function(e){return e.floor()},Fraction:function(e){return e.floor()},\"Array | Matrix\":function(e){return i(e,a,!0)}});return a.toTex=\"\\\\left\\\\lfloor${args[0]}\\\\right\\\\rfloor\",a}var i=r(19);t.name=\"floor\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(t,r){if(!t.isInt()||!r.isInt())throw new Error(\"Parameters in function gcd must be integer numbers\");for(var n=new e.BigNumber(0);!r.isZero();){var i=t.mod(r);t=r,r=i}return t.lt(n)?t.neg():t}var s=n(r(51)),u=n(r(53)),c=n(r(54)),f=n(r(55)),l=n(r(56)),p=n(r(57)),m=a(\"gcd\",{\"number, number\":i,\"BigNumber, BigNumber\":o,\"Fraction, Fraction\":function(e,t){return e.gcd(t)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=c(e,t,m);break;default:r=u(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=u(e,t,m,!1);break;default:r=l(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(s(e),s(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(s(e),t)},\"Matrix, Array\":function(e,t){return m(e,s(t))},\"Matrix, number | BigNumber\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,m,!1);break;default:r=p(e,t,m,!1)}return r},\"number | BigNumber, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=f(t,e,m,!0);break;default:r=p(t,e,m,!0)}return r},\"Array, number | BigNumber\":function(e,t){return p(s(e),t,m,!1).valueOf()},\"number | BigNumber, Array\":function(e,t){return p(s(t),e,m,!0).valueOf()},\"Array | Matrix | number | BigNumber, Array | Matrix | number | BigNumber, ...Array | Matrix | number | BigNumber\":function(e,t,r){for(var n=m(e,t),i=0;i<r.length;i++)n=m(n,r[i]);return n}});return m.toTex=\"\\\\gcd\\\\left(${args}\\\\right)\",m}function i(e,t){if(!a(e)||!a(t))throw new Error(\"Parameters in function gcd must be integer numbers\");for(var r;0!=t;)r=e%t,e=t,t=r;return 0>e?-e:e}var a=r(6).isInteger;t.name=\"gcd\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){for(var t=0,r=0,n=0;n<e.length;n++){var i=s(e[n]);p(r,i)?(t=f(t,f(c(r,i),c(r,i))),t=u(t,1),r=i):t=u(t,m(i)?f(c(i,r),c(i,r)):i)}return f(r,l(t))}var s=n(r(315)),u=n(r(52)),c=n(r(295)),f=n(r(297)),l=n(r(357)),p=n(r(59)),m=n(r(358)),h=a(\"hypot\",{\"... number | BigNumber\":o,Array:function(e){return h.apply(h,i(e))},Matrix:function(e){return h.apply(h,i(e.toArray()))}});return h.toTex=\"\\\\hypot\\\\left(${args}\\\\right)\",h}var i=r(40).flatten;t.name=\"hypot\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){function a(r){return r>=0||t.predictable?Math.sqrt(r):o(new e.Complex(r,0))}function o(t){var r,n,i=Math.sqrt(t.re*t.re+t.im*t.im);return r=t.re>=0?.5*Math.sqrt(2*(i+t.re)):Math.abs(t.im)/Math.sqrt(2*(i-t.re)),n=t.re<=0?.5*Math.sqrt(2*(i-t.re)):Math.abs(t.im)/Math.sqrt(2*(i+t.re)),t.im>=0?new e.Complex(r,n):new e.Complex(r,-n)}var s=n(\"sqrt\",{number:a,Complex:o,BigNumber:function(e){return!e.isNegative()||t.predictable?e.sqrt():a(e.toNumber())},\"Array | Matrix\":function(e){return i(e,s,!0)},Unit:function(e){return e.pow(.5)}});return s.toTex=\"\\\\sqrt{${args[0]}}\",s}var i=r(19);t.name=\"sqrt\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"isPositive\",{number:function(e){return e>0},BigNumber:function(e){return!e.isNeg()&&!e.isZero()&&!e.isNaN()},Fraction:function(e){return e.s>0&&e.n>0},Unit:function(e){return e.value>0},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);r(6);t.name=\"isPositive\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(t,r){if(!t.isInt()||!r.isInt())throw new Error(\"Parameters in function lcm must be integer numbers\");if(t.isZero()||r.isZero())return new e.BigNumber(0);for(var n=t.times(r);!r.isZero();){var i=r;\nr=t.mod(i),t=i}return n.div(t).abs()}var s=n(r(51)),u=n(r(347)),c=n(r(360)),f=n(r(298)),l=n(r(56)),p=n(r(57)),m=a(\"lcm\",{\"number, number\":i,\"BigNumber, BigNumber\":o,\"Fraction, Fraction\":function(t,r){return 0===t.n&&0===r.n?new e.Fraction(0):t.mul(r).abs().div(t.gcd(r))},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=c(e,t,m);break;default:r=u(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=u(e,t,m,!1);break;default:r=l(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(s(e),s(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(s(e),t)},\"Matrix, Array\":function(e,t){return m(e,s(t))},\"Matrix, number | BigNumber\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,m,!1);break;default:r=p(e,t,m,!1)}return r},\"number | BigNumber, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=f(t,e,m,!0);break;default:r=p(t,e,m,!0)}return r},\"Array, number | BigNumber\":function(e,t){return p(s(e),t,m,!1).valueOf()},\"number | BigNumber, Array\":function(e,t){return p(s(t),e,m,!0).valueOf()},\"Array | Matrix | number | BigNumber, Array | Matrix | number | BigNumber, ...Array | Matrix | number | BigNumber\":function(e,t,r){for(var n=m(e,t),i=0;i<r.length;i++)n=m(n,r[i]);return n}});return m.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",m}function i(e,t){if(!a(e)||!a(t))throw new Error(\"Parameters in function lcm must be integer numbers\");if(0==e||0==t)return 0;for(var r,n=e*t;0!=t;)r=t,t=e%r,e=r;return Math.abs(n/e)}var a=r(6).isInteger;t.name=\"lcm\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(48)),u=e.SparseMatrix,c=function(e,t,r){var n=e._values,c=e._size,f=e._datatype,l=t._values,p=t._size,m=t._datatype;if(c.length!==p.length)throw new a(c.length,p.length);if(c[0]!==p[0]||c[1]!==p[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+c+\") must match Matrix B (\"+p+\")\");var h,g=c[0],v=c[1],d=s,y=0,x=r;\"string\"==typeof f&&f===m&&(h=f,d=o.find(s,[h,h]),y=o.convert(0,h),x=o.find(r,[h,h]));for(var w=n&&l?[]:void 0,b=[],N=[],E=new u({values:w,index:b,ptr:N,size:[g,v],datatype:h}),M=w?[]:void 0,A=[],_=[],O=0;v>O;O++){N[O]=b.length;var T=O+1;if(i(e,O,A,M,_,T,E,x),i(t,O,A,M,_,T,E,x),M)for(var C=N[O];C<b.length;){var S=b[C];if(_[S]===T){var z=M[S];d(z,y)?b.splice(C,1):(w.push(z),C++)}else b.splice(C,1)}else for(var B=N[O];B<b.length;){var k=b[B];_[k]!==T?b.splice(B,1):B++}}return N[v]=b.length,E};return c}var i=r(361),a=r(42);t.name=\"algorithm06\",t.factory=n},function(e,t){\"use strict\";e.exports=function(e,t,r,n,i,a,o,s,u,c,f){var l,p,m,h,g=e._values,v=e._index,d=e._ptr,y=o._index;if(n)for(p=d[t],m=d[t+1],l=p;m>l;l++)h=v[l],r[h]!==a?(r[h]=a,y.push(h),c?(n[h]=u?s(g[l],f):s(f,g[l]),i[h]=a):n[h]=g[l]):(n[h]=u?s(g[l],n[h]):s(n[h],g[l]),i[h]=a);else for(p=d[t],m=d[t+1],l=p;m>l;l++)h=v[l],r[h]!==a?(r[h]=a,y.push(h)):i[h]=a}},function(e,t,r){\"use strict\";function n(e,t,r,n){function a(t){return new e.Complex(Math.log(Math.sqrt(t.re*t.re+t.im*t.im))/Math.LN10,Math.atan2(t.im,t.re)/Math.LN10)}var o=n(\"log10\",{number:function(r){return r>=0||t.predictable?Math.log(r)/Math.LN10:o(new e.Complex(r,0))},Complex:a,BigNumber:function(r){return!r.isNegative()||t.predictable?r.log():a(new e.Complex(r.toNumber(),0))},\"Array | Matrix\":function(e){return i(e,o)}});return o.toTex=\"\\\\log_{10}\\\\left(${args[0]}\\\\right)\",o}var i=r(19);t.name=\"log10\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){if(t>0)return e-t*Math.floor(e/t);if(0===t)return e;throw new Error(\"Cannot calculate mod for a negative divisor\")}var o=n(r(51)),s=r(30),u=n(r(347)),c=n(r(60)),f=n(r(303)),l=n(r(298)),p=n(r(62)),m=n(r(56)),h=n(r(57)),g=i(\"mod\",{\"number, number\":a,\"BigNumber, BigNumber\":function(e,t){return t.isZero()?e:e.mod(t)},\"Fraction, Fraction\":function(e,t){return e.mod(t)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,g,!1);break;default:r=u(t,e,g,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,g,!1);break;default:r=m(e,t,g)}}return r},\"Array, Array\":function(e,t){return g(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return g(o(e),t)},\"Matrix, Array\":function(e,t){return g(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,g,!1);break;default:r=h(e,t,g,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=p(t,e,g,!0);break;default:r=h(t,e,g,!0)}return r},\"Array, any\":function(e,t){return h(o(e),t,g,!1).valueOf()},\"any, Array\":function(e,t){return h(o(t),e,g,!0).valueOf()}});return g.toTex=\"\\\\left(${args[0]}\"+s.operators.mod+\"${args[1]}\\\\right)\",g}t.name=\"mod\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){var r=e.size();if(1==r.length){if(t===Number.POSITIVE_INFINITY||\"inf\"===t){var n=0;return e.forEach(function(e){var t=o(e);p(t,n)&&(n=t)},!0),n}if(t===Number.NEGATIVE_INFINITY||\"-inf\"===t){var i;return e.forEach(function(e){var t=o(e);(!i||m(t,i))&&(i=t)},!0),i||0}if(\"fro\"===t)return a(e,2);if(\"number\"==typeof t&&!isNaN(t)){if(!l(t,0)){var h=0;return e.forEach(function(e){h=s(u(o(e),t),h)},!0),u(h,1/t)}return Number.POSITIVE_INFINITY}throw new Error(\"Unsupported parameter value\")}if(2==r.length){if(1===t){var d=[],y=0;return e.forEach(function(e,t){var r=t[1],n=s(d[r]||0,o(e));p(n,y)&&(y=n),d[r]=n},!0),y}if(t===Number.POSITIVE_INFINITY||\"inf\"===t){var x=[],w=0;return e.forEach(function(e,t){var r=t[0],n=s(x[r]||0,o(e));p(n,w)&&(w=n),x[r]=n},!0),w}if(\"fro\"===t)return c(g(f(v(e),e)));if(2===t)throw new Error(\"Unsupported parameter value, missing implementation of matrix singular value decomposition\");throw new Error(\"Unsupported parameter value\")}}var o=n(r(315)),s=n(r(50)),u=n(r(351)),c=n(r(357)),f=n(r(296)),l=n(r(48)),p=n(r(63)),m=n(r(59)),h=n(r(51)),g=n(r(365)),v=n(r(322)),d=i.find(o,[\"Complex\"]),y=i(\"norm\",{number:Math.abs,Complex:d,BigNumber:function(e){return e.abs()},\"boolean | null\":function(e){return Math.abs(e)},Array:function(e){return a(h(e),2)},Matrix:function(e){return a(e,2)},\"number | Complex | BigNumber | boolean | null, number | BigNumber | string\":function(e){return y(e)},\"Array, number | BigNumber | string\":function(e,t){return a(h(e),t)},\"Matrix, number | BigNumber | string\":function(e,t){return a(e,t)}});return y.toTex={1:\"\\\\left\\\\|${args[0]}\\\\right\\\\|\",2:\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\"},y}t.name=\"norm\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(51)),u=n(r(50)),c=o(\"trace\",{Array:function(e){return c(s(e))},Matrix:function(e){var t;switch(e.storage()){case\"dense\":t=f(e);break;case\"sparse\":t=l(e)}return t},any:i}),f=function(e){var t=e._size,r=e._data;switch(t.length){case 1:if(1==t[0])return i(r[0]);throw new RangeError(\"Matrix must be square (size: \"+a(t)+\")\");case 2:var n=t[0],o=t[1];if(n===o){for(var s=0,c=0;n>c;c++)s=u(s,r[c][c]);return s}throw new RangeError(\"Matrix must be square (size: \"+a(t)+\")\");default:throw new RangeError(\"Matrix must be two dimensional (size: \"+a(t)+\")\")}},l=function(e){var t=e._values,r=e._index,n=e._ptr,i=e._size,o=i[0],s=i[1];if(o===s){var c=0;if(t.length>0)for(var f=0;s>f;f++)for(var l=n[f],p=n[f+1],m=l;p>m;m++){var h=r[m];if(h===f){c=u(c,t[m]);break}if(h>f)break}return c}throw new RangeError(\"Matrix must be square (size: \"+a(i)+\")\")};return c.toTex=\"\\\\mathrm{tr}\\\\left(${args[0]}\\\\right)\",c}var i=r(3).clone,a=r(23).format;t.name=\"trace\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t,r){var n=e.BigNumber.precision,i=e.BigNumber.constructor({precision:n+2}),a=new e.BigNumber(0),o=new i(1),s=r.isNegative();if(s&&(r=r.neg()),r.isZero())throw new Error(\"Root must be non-zero\");if(t.isNegative()&&!r.abs().mod(2).equals(1))throw new Error(\"Root must be odd when a is negative.\");if(t.isZero())return a;if(!t.isFinite())return s?a:t;var u=t.abs().pow(o.div(r));return u=t.isNeg()?u.neg():u,new e.BigNumber((s?o.div(u):u).toPrecision(n))}var u=n(r(51)),c=n(r(53)),f=n(r(347)),l=n(r(360)),p=n(r(298)),m=n(r(56)),h=n(r(57)),g=o(\"nthRoot\",{number:function(e){return i(e,2)},\"number, number\":i,BigNumber:function(t){return s(t,new e.BigNumber(2))},Complex:function(e){return a(e,2)},\"Complex, number\":a,\"BigNumber, BigNumber\":s,\"Array | Matrix\":function(e){return g(e,2)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":if(1!==t.density())throw new Error(\"Root must be non-zero\");r=l(e,t,g);break;default:r=f(t,e,g,!0)}break;default:switch(t.storage()){case\"sparse\":if(1!==t.density())throw new Error(\"Root must be non-zero\");r=c(e,t,g,!1);break;default:r=m(e,t,g)}}return r},\"Array, Array\":function(e,t){return g(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return g(u(e),t)},\"Matrix, Array\":function(e,t){return g(e,u(t))},\"Matrix, number | BigNumber\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=p(e,t,g,!1);break;default:r=h(e,t,g,!1)}return r},\"number | BigNumber, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":if(1!==t.density())throw new Error(\"Root must be non-zero\");r=p(t,e,g,!0);break;default:r=h(t,e,g,!0)}return r},\"Array, number | BigNumber\":function(e,t){return g(u(e),t).valueOf()},\"number | BigNumber, Array\":function(e,t){return g(e,u(t)).valueOf()}});return g.toTex=\"\\\\sqrt[${args[1]}]{${args[0]}}\",g}function i(e,t){var r=0>t;if(r&&(t=-t),0===t)throw new Error(\"Root must be non-zero\");if(0>e&&Math.abs(t)%2!=1)throw new Error(\"Root must be odd when a is negative.\");if(0==e)return 0;if(!isFinite(e))return r?0:e;var n=Math.pow(Math.abs(e),1/t);return n=0>e?-n:n,r?1/n:n}function a(e,t){if(0>t)throw new Error(\"Root must be greater than zero\");if(0===t)throw new Error(\"Root must be non-zero\");if(t%1!==0)throw new Error(\"Root must be an integer\");for(var r=e.toPolar(),n=[],i=Math.pow(r.r,1/t),a=0;t>a;a++)n.push({r:i,phi:(r.phi+2*Math.PI*a)/t});return n}t.name=\"nthRoot\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var c=n(r(51)),f=n(r(48)),l=n(r(368)),p=n(r(298)),m=n(r(62)),h=n(r(57)),g=o(\"round\",{number:Math.round,\"number, number\":function(e,t){if(!a(t))throw new TypeError(u);if(0>t||t>15)throw new Error(\"Number of decimals in function round must be in te range of 0-15\");return i(e,t)},Complex:function(t){return new e.Complex(Math.round(t.re),Math.round(t.im))},\"Complex, number\":function(t,r){return new e.Complex(i(t.re,r),i(t.im,r))},\"Complex, BigNumber\":function(t,r){if(!r.isInteger())throw new TypeError(u);var n=r.toNumber();return new e.Complex(i(t.re,n),i(t.im,n))},\"number, BigNumber\":function(t,r){if(!r.isInteger())throw new TypeError(u);return new e.BigNumber(t).toDecimalPlaces(r.toNumber())},BigNumber:function(e){return e.toDecimalPlaces(0)},\"BigNumber, BigNumber\":function(e,t){if(!t.isInteger())throw new TypeError(u);return e.toDecimalPlaces(t.toNumber())},Fraction:function(e){return e.round()},\"Array | Matrix\":function(e){return s(e,g,!0)},\"Matrix, number | BigNumber\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=p(e,t,g,!1);break;default:r=h(e,t,g,!1)}return r},\"number | Complex | BigNumber, Matrix\":function(e,t){if(!f(e,0)){var r;switch(t.storage()){case\"sparse\":r=m(t,e,g,!0);break;default:r=h(t,e,g,!0)}return r}return l(t.size(),t.storage())},\"Array, number | BigNumber\":function(e,t){return h(c(e),t,g,!1).valueOf()},\"number | Complex | BigNumber, Array\":function(e,t){return h(c(t),e,g,!0).valueOf()}});return g.toTex={1:\"\\\\left\\\\lfloor${args[0]}\\\\right\\\\rceil\",2:\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\"},g}function i(e,t){return parseFloat(o(e,t))}var a=r(6).isInteger,o=r(6).toFixed,s=r(19),u=\"Number of decimals in function round must be an integer\";t.name=\"round\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t,r){var n=u(t),i=n?new e.BigNumber(0):0;if(c(t),r){var o=f(r);return t.length>0?o.resize(t,i):o}var s=[];return t.length>0?a(s,t,i):s}function u(e){var t=!1;return e.forEach(function(e,r,n){e&&e.isBigNumber===!0&&(t=!0,n[r]=e.toNumber())}),t}function c(e){e.forEach(function(e){if(\"number\"!=typeof e||!i(e)||0>e)throw new Error(\"Parameters in function zeros must be positive integers\")})}var f=n(r(51)),l=o(\"zeros\",{\"\":function(){return\"array\"===t.matrix?s([]):s([],\"default\")},\"...number | BigNumber | string\":function(e){var r=e[e.length-1];if(\"string\"==typeof r){var n=e.pop();return s(e,n)}return\"array\"===t.matrix?s(e):s(e,\"default\")},Array:s,Matrix:function(e){var t=e.storage();return s(e.valueOf(),t)},\"Array | Matrix, string\":function(e,t){return s(e.valueOf(),t)}});return l.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",l}var i=r(6).isInteger,a=r(40).resize;t.name=\"zeros\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"sign\",{number:i.sign,Complex:function(t){var r=Math.sqrt(t.re*t.re+t.im*t.im);return new e.Complex(t.re/r,t.im/r)},BigNumber:function(t){return new e.BigNumber(t.cmp(0))},Fraction:function(t){return new e.Fraction(t.s)},\"Array | Matrix\":function(e){return a(e,o,!0)},Unit:function(e){return i.sign(e.value)}});return o.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",o}var i=r(6),a=r(19);t.name=\"sign\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"square\",{number:function(e){return e*e},Complex:function(t){return new e.Complex(t.re*t.re-t.im*t.im,t.re*t.im+t.im*t.re)},BigNumber:function(e){return e.times(e)},Fraction:function(e){return e.mul(e)},\"Array | Matrix\":function(e){return i(e,a,!0)},Unit:function(e){return e.pow(2)}});return a.toTex=\"\\\\left(${args[0]}\\\\right)^2\",a}var i=r(19);t.name=\"square\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=a(\"unaryPlus\",{number:function(e){return e},Complex:function(e){return e.clone()},BigNumber:function(e){return e},Fraction:function(e){return e},Unit:function(e){return e.clone()},\"Array | Matrix\":function(e){return i(e,s,!0)},\"boolean | string | null\":function(r){return\"bignumber\"==t.number?new e.BigNumber(+r):+r}});return s.toTex=o.operators.unaryPlus+\"\\\\left(${args[0]}\\\\right)\",s}var i=r(19);t.name=\"unaryPlus\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,r){var n,a,o,s=0,c=1,f=1,l=0;if(!i(e)||!i(r))throw new Error(\"Parameters in function xgcd must be integer numbers\");for(;r;)a=Math.floor(e/r),o=e%r,n=s,s=c-a*s,c=n,n=f,f=l-a*f,l=n,e=r,r=o;var p;return p=0>e?[-e,-c,-l]:[e,e?c:0,l],\"array\"===t.matrix?p:u(p)}function s(r,n){var i,a,o,s=new e.BigNumber(0),c=new e.BigNumber(0),f=new e.BigNumber(1),l=new e.BigNumber(1),p=new e.BigNumber(0);if(!r.isInt()||!n.isInt())throw new Error(\"Parameters in function xgcd must be integer numbers\");for(;!n.isZero();)a=r.div(n).floor(),o=r.mod(n),i=c,c=f.minus(a.times(c)),f=i,i=l,l=p.minus(a.times(l)),p=i,r=n,n=o;var m;return m=r.lt(s)?[r.neg(),f.neg(),p.neg()]:[r,r.isZero()?0:f,p],\"array\"===t.matrix?m:u(m)}var u=n(r(51)),c=a(\"xgcd\",{\"number, number\":o,\"BigNumber, BigNumber\":s});return c.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",c}var i=r(6).isInteger;t.name=\"xgcd\",t.factory=n},function(e,t,r){e.exports=[r(374),r(378),r(379),r(381),r(383),r(386),r(388)]},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(347)),f=n(r(360)),l=n(r(298)),p=n(r(56)),m=n(r(57)),h=o(\"bitAnd\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function bitAnd\");return e&t},\"BigNumber, BigNumber\":a,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,h,!1);break;default:r=c(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=p(e,t,h)}}return r},\"Array, Array\":function(e,t){return h(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(u(e),t)},\"Matrix, Array\":function(e,t){return h(e,u(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, any\":function(e,t){return m(u(e),t,h,!1).valueOf()},\"any, Array\":function(e,t){return m(u(t),e,h,!0).valueOf()}});return h.toTex=\"\\\\left(${args[0]}\"+s.operators.bitAnd+\"${args[1]}\\\\right)\",h}var i=r(6).isInteger,a=r(375);t.name=\"bitAnd\",t.factory=n},function(e,t,r){var n=r(376);e.exports=function(e,t){if(e.isFinite()&&!e.isInteger()||t.isFinite()&&!t.isInteger())throw new Error(\"Integers expected in function bitAnd\");var r=e.constructor;if(e.isNaN()||t.isNaN())return new r(NaN);if(e.isZero()||t.eq(-1)||e.eq(t))return e;if(t.isZero()||e.eq(-1))return t;if(!e.isFinite()||!t.isFinite()){if(!e.isFinite()&&!t.isFinite())return e.isNegative()==t.isNegative()?e:new r(0);if(!e.isFinite())return t.isNegative()?e:e.isNegative()?new r(0):t;if(!t.isFinite())return e.isNegative()?t:t.isNegative()?new r(0):e}return n(e,t,function(e,t){return e&t})}},function(e,t,r){function n(e){for(var t=e.c,r=t[0]+\"\",n=1;n<t.length;++n){for(var i=t[n]+\"\",a=7-i.length;a--;)i=\"0\"+i;r+=i}var o;for(o=r.length-1;\"0\"==r.charAt(o);--o);var s=e.e,u=r.slice(0,o+1||1),c=u.length;if(s>0)if(++s>c)for(s-=c;s--;u+=\"0\");else c>s&&(u=u.slice(0,s)+\".\"+u.slice(s));for(var f=[0],n=0;n<u.length;){for(var l=f.length;l--;f[l]*=10);f[0]+=u.charAt(n++)<<0;for(var o=0;o<f.length;++o)f[o]>1&&(null==f[o+1]&&(f[o+1]=0),f[o+1]+=f[o]>>1,f[o]&=1)}return f.reverse()}var i=r(377);e.exports=function(e,t,r){var a,o,s=e.constructor,u=+(e.s<0),c=+(t.s<0);if(u){a=n(i(e));for(var f=0;f<a.length;++f)a[f]^=1}else a=n(e);if(c){o=n(i(t));for(var f=0;f<o.length;++f)o[f]^=1}else o=n(t);var l,p,m;a.length<=o.length?(l=a,p=o,m=u):(l=o,p=a,m=c);var h=l.length,g=p.length,v=1^r(u,c),d=new s(1^v),y=s.ONE,x=new s(2),w=s.precision;for(s.config({precision:1e9});h>0;)r(l[--h],p[--g])==v&&(d=d.plus(y)),y=y.times(x);for(;g>0;)r(m,p[--g])==v&&(d=d.plus(y)),y=y.times(x);return s.config({precision:w}),0==v&&(d.s=-d.s),d}},function(e,t){e.exports=function(e){if(e.isFinite()&&!e.isInteger())throw new Error(\"Integer expected in function bitNot\");var t=e.constructor,r=t.precision;t.config({precision:1e9});var e=e.plus(t.ONE);return e.s=-e.s||null,t.config({precision:r}),e}},function(e,t,r){\"use strict\";function n(e,t,n,s){var u=r(30),c=s(\"bitNot\",{number:function(e){if(!o(e))throw new Error(\"Integer expected in function bitNot\");return~e},BigNumber:a,\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=u.operators.bitNot+\"\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(377),o=r(6).isInteger;t.name=\"bitNot\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(53)),f=n(r(54)),l=n(r(55)),p=n(r(56)),m=n(r(57)),h=o(\"bitOr\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function bitOr\");return e|t},\"BigNumber, BigNumber\":a,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,h);break;default:r=c(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=p(e,t,h)}}return r},\"Array, Array\":function(e,t){return h(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(u(e),t)},\"Matrix, Array\":function(e,t){return h(e,u(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, any\":function(e,t){return m(u(e),t,h,!1).valueOf()},\"any, Array\":function(e,t){return m(u(t),e,h,!0).valueOf()}});return h.toTex=\"\\\\left(${args[0]}\"+s.operators.bitOr+\"${args[1]}\\\\right)\",h}var i=r(6).isInteger,a=r(380);t.name=\"bitOr\",t.factory=n},function(e,t,r){var n=r(376);e.exports=function(e,t){if(e.isFinite()&&!e.isInteger()||t.isFinite()&&!t.isInteger())throw new Error(\"Integers expected in function bitOr\");var r=e.constructor;if(e.isNaN()||t.isNaN())return new r(NaN);var i=new r(-1);return e.isZero()||t.eq(i)||e.eq(t)?t:t.isZero()||e.eq(i)?e:e.isFinite()&&t.isFinite()?n(e,t,function(e,t){return e|t}):!e.isFinite()&&!e.isNegative()&&t.isNegative()||e.isNegative()&&!t.isNegative()&&!t.isFinite()?i:e.isNegative()&&t.isNegative()?e.isFinite()?e:t:e.isFinite()?t:e}},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(60)),f=n(r(61)),l=n(r(62)),p=n(r(56)),m=n(r(57)),h=o(\"bitXor\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function bitXor\");return e^t},\"BigNumber, BigNumber\":a,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,h);break;default:r=c(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=p(e,t,h)}}return r},\"Array, Array\":function(e,t){return h(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(u(e),t)},\"Matrix, Array\":function(e,t){return h(e,u(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=l(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, any\":function(e,t){return m(u(e),t,h,!1).valueOf()},\"any, Array\":function(e,t){return m(u(t),e,h,!0).valueOf()}});return h.toTex=\"\\\\left(${args[0]}\"+s.operators.bitXor+\"${args[1]}\\\\right)\",h}var i=r(6).isInteger,a=r(382);t.name=\"bitXor\",t.factory=n},function(e,t,r){var n=r(376),i=r(377);e.exports=function(e,t){if(e.isFinite()&&!e.isInteger()||t.isFinite()&&!t.isInteger())throw new Error(\"Integers expected in function bitXor\");var r=e.constructor;if(e.isNaN()||t.isNaN())return new r(NaN);if(e.isZero())return t;if(t.isZero())return e;if(e.eq(t))return new r(0);var a=new r(-1);return e.eq(a)?i(t):t.eq(a)?i(e):e.isFinite()&&t.isFinite()?n(e,t,function(e,t){return e^t}):e.isFinite()||t.isFinite()?new r(e.isNegative()==t.isNegative()?1/0:-(1/0)):a}},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(48)),f=n(r(368)),l=n(r(53)),p=n(r(347)),m=n(r(385)),h=n(r(55)),g=n(r(298)),v=n(r(56)),d=n(r(57)),y=o(\"leftShift\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function leftShift\");return e<<t},\"BigNumber, BigNumber\":a,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=m(e,t,y,!1);break;default:r=p(t,e,y,!0)}break;default:switch(t.storage()){case\"sparse\":r=l(e,t,y,!1);break;default:r=v(e,t,y)}}return r},\"Array, Array\":function(e,t){return y(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return y(u(e),t)},\"Matrix, Array\":function(e,t){return y(e,u(t))},\"Matrix, number | BigNumber\":function(e,t){if(!c(t,0)){var r;switch(e.storage()){case\"sparse\":r=g(e,t,y,!1);break;default:r=d(e,t,y,!1)}return r}return e.clone()},\"number | BigNumber, Matrix\":function(e,t){if(!c(e,0)){var r;switch(t.storage()){case\"sparse\":r=h(t,e,y,!0);break;default:r=d(t,e,y,!0)}return r}return f(t.size(),t.storage())},\"Array, number | BigNumber\":function(e,t){return y(u(e),t).valueOf()},\"number | BigNumber, Array\":function(e,t){return y(e,u(t)).valueOf()}});return y.toTex=\"\\\\left(${args[0]}\"+s.operators.leftShift+\"${args[1]}\\\\right)\",y}var i=r(6).isInteger,a=r(384);t.name=\"leftShift\",t.factory=n},function(e,t){e.exports=function(e,t){if(e.isFinite()&&!e.isInteger()||t.isFinite()&&!t.isInteger())throw new Error(\"Integers expected in function leftShift\");var r=e.constructor;return e.isNaN()||t.isNaN()||t.isNegative()&&!t.isZero()?new r(NaN):e.isZero()||t.isZero()?e:e.isFinite()||t.isFinite()?t.lt(55)?e.times(Math.pow(2,t.toNumber())+\"\"):e.times(new r(2).pow(t)):new r(NaN)}},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(48)),s=e.SparseMatrix,u=function(e,t,r){var n=e._values,u=e._index,c=e._ptr,f=e._size,l=e._datatype,p=t._values,m=t._index,h=t._ptr,g=t._size,v=t._datatype;if(f.length!==g.length)throw new i(f.length,g.length);if(f[0]!==g[0]||f[1]!==g[1])throw new RangeError(\"Dimension mismatch. Matrix A (\"+f+\") must match Matrix B (\"+g+\")\");if(!n||!p)throw new Error(\"Cannot perform operation on Pattern Sparse Matrices\");var d,y=f[0],x=f[1],w=o,b=0,N=r;\"string\"==typeof l&&l===v&&(d=l,w=a.find(o,[d,d]),b=a.convert(0,d),N=a.find(r,[d,d]));for(var E,M,A,_,O=[],T=[],C=[],S=new s({values:O,index:T,ptr:C,size:[y,x],datatype:d}),z=[],B=[],k=0;x>k;k++){C[k]=T.length;var I=k+1;for(M=c[k],A=c[k+1],E=M;A>E;E++)_=u[E],B[_]=I,z[_]=n[E],T.push(_);for(M=h[k],A=h[k+1],E=M;A>E;E++)_=m[E],B[_]===I&&(z[_]=N(z[_],p[E]));for(E=C[k];E<T.length;){_=T[E];var R=z[_];w(R,b)?T.splice(E,1):(O.push(R),E++)}}return C[x]=T.length,S};return u}var i=r(42);t.name=\"algorithm08\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=r(30),u=n(r(51)),c=n(r(48)),f=n(r(368)),l=n(r(53)),p=n(r(347)),m=n(r(385)),h=n(r(55)),g=n(r(298)),v=n(r(56)),d=n(r(57)),y=o(\"rightArithShift\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function rightArithShift\");return e>>t},\"BigNumber, BigNumber\":a,\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=m(e,t,y,!1);break;default:r=p(t,e,y,!0)}break;default:switch(t.storage()){case\"sparse\":r=l(e,t,y,!1);break;default:r=v(e,t,y)}}return r},\"Array, Array\":function(e,t){return y(u(e),u(t)).valueOf()},\"Array, Matrix\":function(e,t){return y(u(e),t)},\"Matrix, Array\":function(e,t){return y(e,u(t))},\"Matrix, number | BigNumber\":function(e,t){if(!c(t,0)){var r;switch(e.storage()){case\"sparse\":r=g(e,t,y,!1);break;default:r=d(e,t,y,!1)}return r}return e.clone()},\"number | BigNumber, Matrix\":function(e,t){if(!c(e,0)){var r;switch(t.storage()){case\"sparse\":r=h(t,e,y,!0);break;default:r=d(t,e,y,!0)}return r}return f(t.size(),t.storage())},\"Array, number | BigNumber\":function(e,t){return y(u(e),t).valueOf()},\"number | BigNumber, Array\":function(e,t){return y(e,u(t)).valueOf()}});return y.toTex=\"\\\\left(${args[0]}\"+s.operators.rightArithShift+\"${args[1]}\\\\right)\",y}var i=r(6).isInteger,a=r(387);t.name=\"rightArithShift\",t.factory=n},function(e,t){e.exports=function(e,t){if(e.isFinite()&&!e.isInteger()||t.isFinite()&&!t.isInteger())throw new Error(\"Integers expected in function rightArithShift\");var r=e.constructor;return e.isNaN()||t.isNaN()||t.isNegative()&&!t.isZero()?new r(NaN):e.isZero()||t.isZero()?e:t.isFinite()?t.lt(55)?e.div(Math.pow(2,t.toNumber())+\"\").floor():e.div(new r(2).pow(t)).floor():new r(e.isNegative()?-1:e.isFinite()?0:NaN)}},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=n(r(51)),u=n(r(48)),c=n(r(368)),f=n(r(53)),l=n(r(347)),p=n(r(385)),m=n(r(55)),h=n(r(298)),g=n(r(56)),v=n(r(57)),d=a(\"rightLogShift\",{\"number, number\":function(e,t){if(!i(e)||!i(t))throw new Error(\"Integers expected in function rightLogShift\");return e>>>t},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=p(e,t,d,!1);break;default:r=l(t,e,d,!0)}break;default:switch(t.storage()){case\"sparse\":r=f(e,t,d,!1);break;default:r=g(e,t,d)}}return r},\"Array, Array\":function(e,t){return d(s(e),s(t)).valueOf()},\"Array, Matrix\":function(e,t){return d(s(e),t)},\"Matrix, Array\":function(e,t){return d(e,s(t))},\"Matrix, number | BigNumber\":function(e,t){if(!u(t,0)){var r;switch(e.storage()){case\"sparse\":r=h(e,t,d,!1);break;default:r=v(e,t,d,!1)}return r}return e.clone()},\"number | BigNumber, Matrix\":function(e,t){if(!u(e,0)){var r;switch(t.storage()){case\"sparse\":r=m(t,e,d,!0);break;default:r=v(t,e,d,!0)}return r}return c(t.size(),t.storage())},\"Array, number | BigNumber\":function(e,t){return d(s(e),t).valueOf()},\"number | BigNumber, Array\":function(e,t){return d(e,s(t)).valueOf()}});return d.toTex=\"\\\\left(${args[0]}\"+o.operators.rightLogShift+\"${args[1]}\\\\right)\",d}var i=r(6).isInteger;t.name=\"rightLogShift\",t.factory=n},function(e,t,r){e.exports=[r(390),r(397),r(391),r(398)]},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(50)),o=n(r(391)),s=n(r(395)),u=n(r(396)),c=i(\"bellNumbers\",{\"number | BigNumber\":function(e){if(!u(e)||s(e))throw new TypeError(\"Non-negative integer value expected in function bellNumbers\");for(var t=0,r=0;e>=r;r++)t=a(t,o(e,r));return t}});return c.toTex=\"\\\\mathrm{B}_{${args[0]}}\",c}t.name=\"bellNumbers\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(50)),o=n(r(302)),s=n(r(296)),u=n(r(294)),c=n(r(351)),f=n(r(392)),l=n(r(394)),p=n(r(395)),m=n(r(396)),h=n(r(63)),g=i(\"stirlingS2\",{\"number | BigNumber, number | BigNumber\":function(e,t){if(!m(e)||p(e)||!m(t)||p(t))throw new TypeError(\"Non-negative integer value expected in function stirlingS2\");if(h(t,e))throw new TypeError(\"k must be less than or equal to n in function stirlingS2\");for(var r=f(t),n=0,i=0;t>=i;i++){var g=c(-1,o(t,i)),v=l(t,i),d=c(i,e);n=a(n,s(s(v,d),g))}return u(n,r)}});return g.toTex=\"\\\\mathrm{S}\\\\left(${args[0]},${args[1]}\\\\right)\",g}t.name=\"stirlingS2\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(393)),s=r(30),u=a(\"factorial\",{number:function(e){if(0>e)throw new Error(\"Value must be non-negative\");return o(e+1)},BigNumber:function(e){if(e.isNegative())throw new Error(\"Value must be non-negative\");return o(e.plus(1))},\"Array | Matrix\":function(e){return i(e,u)}});return u.toTex=\"\\\\left(${args[0]}\\\\right)\"+s.operators.factorial,u}var i=r(19);r(77);t.name=\"factorial\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,u){function c(r){if(r.isZero())return new e.BigNumber(1);for(var n=t.precision+(0|Math.log(r.toNumber())),i=e.BigNumber.constructor({precision:n}),a=new i(r),o=r.toNumber()-1;o>1;)a=a.times(o),o--;return new e.BigNumber(a.toPrecision(e.BigNumber.precision))}var f=n(r(296)),l=n(r(351)),p=u(\"gamma\",{number:function(e){var t,r;if(a(e)){if(0>=e)return isFinite(e)?1/0:NaN;if(e>171)return 1/0;for(var n=e-2,i=e-1;n>1;)i*=n,n--;return 0==i&&(i=1),i}if(.5>e)return Math.PI/(Math.sin(Math.PI*e)*p(1-e));if(e>=171.35)return 1/0;if(e>85){var u=e*e,c=u*e,f=c*e,l=f*e;return Math.sqrt(2*Math.PI/e)*Math.pow(e/Math.E,e)*(1+1/(12*e)+1/(288*u)-139/(51840*c)-571/(2488320*f)+163879/(209018880*l)+5246819/(75246796800*l*e))}--e,r=s[0];for(var m=1;m<s.length;++m)r+=s[m]/(e+m);return t=e+o+.5,Math.sqrt(2*Math.PI)*Math.pow(t,e+.5)*Math.exp(-t)*r},Complex:function(t){var r,n;if(0==t.im)return p(t.re);t=new e.Complex(t.re-1,t.im),n=new e.Complex(s[0],0);for(var i=1;i<s.length;++i){var a=t.re+i,u=a*a+t.im*t.im;0!=u?(n.re+=s[i]*a/u,n.im+=-(s[i]*t.im)/u):n.re=s[i]<0?-(1/0):1/0}r=new e.Complex(t.re+o+.5,t.im);var c=Math.sqrt(2*Math.PI);t.re+=.5;var m=l(r,t);0==m.im?m.re*=c:0==m.re?m.im*=c:(m.re*=c,m.im*=c);var h=Math.exp(-r.re);return r.re=h*Math.cos(-r.im),r.im=h*Math.sin(-r.im),f(f(m,r),n)},BigNumber:function(t){if(t.isInteger())return t.isNegative()||t.isZero()?new e.BigNumber(1/0):c(t.minus(1));if(!t.isFinite())return new e.BigNumber(t.isNegative()?NaN:1/0);throw new Error(\"Integer BigNumber expected\")},\"Array | Matrix\":function(e){return i(e,p)}});return p.toTex=\"\\\\Gamma\\\\left(${args[0]}\\\\right)\",p}var i=r(19),a=r(6).isInteger,o=4.7421875,s=[.9999999999999971,57.15623566586292,-59.59796035547549,14.136097974741746,-.4919138160976202,3399464998481189e-20,4652362892704858e-20,-9837447530487956e-20,.0001580887032249125,-.00021026444172410488,.00021743961811521265,-.0001643181065367639,8441822398385275e-20,-26190838401581408e-21,36899182659531625e-22];t.name=\"gamma\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"combinations\",{\"number, number\":function(e,t){var r,n,i;if(!a(e)||0>e)throw new TypeError(\"Positive integer value expected in function combinations\");if(!a(t)||0>t)throw new TypeError(\"Positive integer value expected in function combinations\");if(t>e)throw new TypeError(\"k must be less than or equal to n\");for(r=Math.max(t,e-t),n=1,i=1;e-r>=i;i++)n=n*(r+i)/i;return n},\"BigNumber, BigNumber\":function(t,r){var n,a,o,s,u=new e.BigNumber(1);if(!i(t)||!i(r))throw new TypeError(\"Positive integer value expected in function combinations\");if(r.gt(t))throw new TypeError(\"k must be less than n in function combinations\");for(n=t.minus(r),r.lt(n)&&(n=r),a=u,o=u,s=t.minus(n);o.lte(s);o=o.plus(1))a=a.times(n.plus(o)).dividedBy(o);\nreturn a}});return o.toTex=\"\\\\binom{${args[0]}}{${args[1]}}\",o}function i(e){return e.isInteger()&&e.gte(0)}var a=r(6).isInteger;t.name=\"combinations\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"isNegative\",{number:function(e){return 0>e},BigNumber:function(e){return e.isNeg()&&!e.isZero()&&!e.isNaN()},Fraction:function(e){return e.s<0&&e.n>0},Unit:function(e){return e.value<0},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);r(6);t.name=\"isNegative\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"isInteger\",{number:a.isInteger,BigNumber:function(e){return e.isInt()},Fraction:function(e){return 1===e.d&&isFinite(e.n)},\"Array | Matrix\":function(e){return i(e,o)}});return o}var i=r(19),a=r(6);t.name=\"isInteger\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(394)),o=n(r(52)),s=n(r(358)),u=n(r(396)),c=n(r(63)),f=i(\"composition\",{\"number | BigNumber, number | BigNumber\":function(e,t){if(!(u(e)&&s(e)&&u(t)&&s(t)))throw new TypeError(\"Positive integer value expected in function composition\");if(c(t,e))throw new TypeError(\"k must be less than or equal to n in function composition\");return a(o(e,-1),o(t,-1))}});return f.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",f}t.name=\"composition\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(50)),o=n(r(294)),s=n(r(296)),u=n(r(394)),c=n(r(395)),f=n(r(396)),l=i(\"catalan\",{\"number | BigNumber\":function(e){if(!f(e)||c(e))throw new TypeError(\"Non-negative integer value expected in function catalan\");return o(u(s(e,2),e),a(e,1))}});return l.toTex=\"\\\\mathrm{C}_{${args[0]}}\",l}t.name=\"catalan\",t.factory=n},function(e,t,r){e.exports=[r(400),r(401),r(402),r(403)]},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"arg\",{number:function(e){return Math.atan2(0,e)},Complex:function(e){return Math.atan2(e.im,e.re)},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex=\"\\\\arg\\\\left(${args[0]}\\\\right)\",a}var i=r(19);t.name=\"arg\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"conj\",{number:function(e){return e},BigNumber:function(e){return e},Complex:function(t){return new e.Complex(t.re,-t.im)},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex=\"\\\\left(${args[0]}\\\\right)^*\",a}var i=r(19);t.name=\"conj\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"im\",{number:function(e){return 0},BigNumber:function(t){return new e.BigNumber(0)},Complex:function(e){return e.im},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex=\"\\\\Im\\\\left\\\\lbrace${args[0]}\\\\right\\\\rbrace\",a}var i=r(19);t.name=\"im\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"re\",{number:function(e){return e},BigNumber:function(e){return e},Complex:function(e){return e.re},\"Array | Matrix\":function(e){return i(e,a)}});return a.toTex=\"\\\\Re\\\\left\\\\lbrace${args[0]}\\\\right\\\\rbrace\",a}var i=r(19);t.name=\"re\",t.factory=n},function(e,t,r){e.exports=[r(405),r(406)]},function(e,t,r){\"use strict\";function n(e,t,n,f){var l=n(r(51)),p=f(\"intersect\",{\"Array, Array, Array\":function(e,t,r){if(!a(e))throw new TypeError(\"Array with 3 numbers expected for first argument\");if(!a(t))throw new TypeError(\"Array with 3 numbers expected for second argument\");if(!o(r))throw new TypeError(\"Array with 4 numbers expected as third argument\");return c(e[0],e[1],e[2],t[0],t[1],t[2],r[0],r[1],r[2],r[3])},\"Array, Array, Array, Array\":function(e,t,r,n){if(2===e.length){if(!i(e))throw new TypeError(\"Array with 2 numbers expected for first argument\");if(!i(t))throw new TypeError(\"Array with 2 numbers expected for second argument\");if(!i(r))throw new TypeError(\"Array with 2 numbers expected for third argument\");if(!i(n))throw new TypeError(\"Array with 2 numbers expected for fourth argument\");return s(e[0],e[1],t[0],t[1],r[0],r[1],n[0],n[1])}if(3===e.length){if(!a(e))throw new TypeError(\"Array with 3 numbers expected for first argument\");if(!a(t))throw new TypeError(\"Array with 3 numbers expected for second argument\");if(!a(r))throw new TypeError(\"Array with 3 numbers expected for third argument\");if(!a(n))throw new TypeError(\"Array with 3 numbers expected for fourth argument\");return u(e[0],e[1],e[2],t[0],t[1],t[2],r[0],r[1],r[2],n[0],n[1],n[2])}throw new TypeError(\"Arrays with two or thee dimensional points expected\")},\"Matrix, Matrix, Matrix\":function(e,t,r){return l(p(e.valueOf(),t.valueOf(),r.valueOf()))},\"Matrix, Matrix, Matrix, Matrix\":function(e,t,r,n){return l(p(e.valueOf(),t.valueOf(),r.valueOf(),n.valueOf()))}});return p}function i(e){return 2===e.length&&\"number\"==typeof e[0]&&\"number\"==typeof e[1]}function a(e){return 3===e.length&&\"number\"==typeof e[0]&&\"number\"==typeof e[1]&&\"number\"==typeof e[2]}function o(e){return 4===e.length&&\"number\"==typeof e[0]&&\"number\"==typeof e[1]&&\"number\"==typeof e[2]&&\"number\"==typeof e[3]}function s(e,t,r,n,i,a,o,s){var u=(e-i)*(o-i)+(t-a)*(s-a),c=(o-i)*(r-e)+(s-a)*(n-t),f=(e-i)*(r-e)+(t-a)*(n-t),l=(o-i)*(o-i)+(s-a)*(s-a),p=(r-e)*(r-e)+(n-t)*(n-t),m=(u*c-f*l)/(p*l-c*c),h=(u+m*c)/l,g=e+m*(r-e),v=t+m*(n-t),d=i+h*(o-i),y=a+h*(s-a);return g===d&&v===y?[g,v]:null}function u(e,t,r,n,i,a,o,s,u,c,f,l){var p=(e-o)*(c-o)+(t-s)*(f-s)+(r-u)*(l-u),m=(c-o)*(n-e)+(f-s)*(i-t)+(l-u)*(a-r),h=(e-o)*(n-e)+(t-s)*(i-t)+(r-u)*(a-r),g=(c-o)*(c-o)+(f-s)*(f-s)+(l-u)*(l-u),v=(n-e)*(n-e)+(i-t)*(i-t)+(a-r)*(a-r),d=(p*m-h*g)/(v*g-m*m),y=(p+d*m)/g,x=e+d*(n-e),w=t+d*(i-t),b=r+d*(a-r),N=o+y*(c-o),E=s+y*(f-s),M=u+y*(l-u);return x===N&&w===E&&b===M?[x,w,b]:null}function c(e,t,r,n,i,a,o,s,u,c){var f=(c-e*o-t*s-r*u)/(n*o+i*s+a*u-e-t-r),l=e+f*(n-e),p=t+f*(i-t),m=r+f*(a-r);return[l,p,m]}t.name=\"intersect\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){var h=(n(r(51)),s(\"distance\",{\"Array, Array, Array\":function(e,t,r){if(2==e.length&&2==t.length&&2==r.length){if(!i(e))throw new TypeError(\"Array with 2 numbers expected for first argument\");if(!i(t))throw new TypeError(\"Array with 2 numbers expected for second argument\");if(!i(r))throw new TypeError(\"Array with 2 numbers expected for third argument\");var n=(r[1]-r[0])/(t[1]-t[0]),a=n*n*t[0],o=-1*(n*t[0]),s=e[1];return c(e[0],e[1],a,o,s)}throw new TypeError(\"Invalid Arguments: Try again\")},\"Object, Object, Object\":function(e,t,r){if(2==Object.keys(e).length&&2==Object.keys(t).length&&2==Object.keys(r).length){if(!i(e))throw new TypeError(\"Values of pointX and pointY should be numbers\");if(!i(t))throw new TypeError(\"Values of lineOnePtX and lineOnePtY should be numbers\");if(!i(r))throw new TypeError(\"Values of lineTwoPtX and lineTwoPtY should be numbers\");if(e.hasOwnProperty(\"pointX\")&&e.hasOwnProperty(\"pointY\")&&t.hasOwnProperty(\"lineOnePtX\")&&t.hasOwnProperty(\"lineOnePtY\")&&r.hasOwnProperty(\"lineTwoPtX\")&&r.hasOwnProperty(\"lineTwoPtY\")){var n=(r.lineTwoPtY-r.lineTwoPtX)/(t.lineOnePtY-t.lineOnePtX),a=n*n*t.lineOnePtX,o=-1*(n*t.lineOnePtX),s=e.pointX;return c(e.pointX,e.pointY,a,o,s)}throw new TypeError(\"Key names do not match\")}throw new TypeError(\"Invalid Arguments: Try again\")},\"Array, Array\":function(e,t){if(2==e.length&&3==t.length){if(!i(e))throw new TypeError(\"Array with 2 numbers expected for first argument\");if(!a(t))throw new TypeError(\"Array with 3 numbers expected for second argument\");return c(e[0],e[1],t[0],t[1],t[2])}if(3==e.length&&6==t.length){if(!a(e))throw new TypeError(\"Array with 3 numbers expected for first argument\");if(!o(t))throw new TypeError(\"Array with 6 numbers expected for second argument\");return f(e[0],e[1],e[2],t[0],t[1],t[2],t[3],t[4],t[5])}if(2==e.length&&2==t.length){if(!i(e))throw new TypeError(\"Array with 2 numbers expected for first argument\");if(!i(t))throw new TypeError(\"Array with 2 numbers expected for second argument\");return l(e[0],e[1],t[0],t[1])}if(3==e.length&&3==t.length){if(!a(e))throw new TypeError(\"Array with 3 numbers expected for first argument\");if(!a(t))throw new TypeError(\"Array with 3 numbers expected for second argument\");return p(e[0],e[1],e[2],t[0],t[1],t[2])}throw new TypeError(\"Invalid Arguments: Try again\")},\"Object, Object\":function(e,t){if(2==Object.keys(e).length&&3==Object.keys(t).length){if(!i(e))throw new TypeError(\"Values of pointX and pointY should be numbers\");if(!a(t))throw new TypeError(\"Values of xCoeffLine, yCoeffLine and constant should be numbers\");if(e.hasOwnProperty(\"pointX\")&&e.hasOwnProperty(\"pointY\")&&t.hasOwnProperty(\"xCoeffLine\")&&t.hasOwnProperty(\"yCoeffLine\")&&t.hasOwnProperty(\"yCoeffLine\"))return c(e.pointX,e.pointY,t.xCoeffLine,t.yCoeffLine,t.constant);throw new TypeError(\"Key names do not match\")}if(3==Object.keys(e).length&&6==Object.keys(t).length){if(!a(e))throw new TypeError(\"Values of pointX, pointY and pointZ should be numbers\");if(!o(t))throw new TypeError(\"Values of x0, y0, z0, a, b and c should be numbers\");if(e.hasOwnProperty(\"pointX\")&&e.hasOwnProperty(\"pointY\")&&t.hasOwnProperty(\"x0\")&&t.hasOwnProperty(\"y0\")&&t.hasOwnProperty(\"z0\")&&t.hasOwnProperty(\"a\")&&t.hasOwnProperty(\"b\")&&t.hasOwnProperty(\"c\"))return f(e.pointX,e.pointY,e.pointZ,t.x0,t.y0,t.z0,t.a,t.b,t.c);throw new TypeError(\"Key names do not match\")}if(2==Object.keys(e).length&&2==Object.keys(t).length){if(!i(e))throw new TypeError(\"Values of pointOneX and pointOneY should be numbers\");if(!i(t))throw new TypeError(\"Values of pointTwoX and pointTwoY should be numbers\");if(e.hasOwnProperty(\"pointOneX\")&&e.hasOwnProperty(\"pointOneY\")&&t.hasOwnProperty(\"pointTwoX\")&&t.hasOwnProperty(\"pointTwoY\"))return l(e.pointOneX,e.pointOneY,t.pointTwoX,t.pointTwoY);throw new TypeError(\"Key names do not match\")}if(3==Object.keys(e).length&&3==Object.keys(t).length){if(!a(e))throw new TypeError(\"Values of pointOneX, pointOneY and pointOneZ should be numbers\");if(!a(t))throw new TypeError(\"Values of pointTwoX, pointTwoY and pointTwoZ should be numbers\");if(e.hasOwnProperty(\"pointOneX\")&&e.hasOwnProperty(\"pointOneY\")&&e.hasOwnProperty(\"pointOneZ\")&&t.hasOwnProperty(\"pointTwoX\")&&t.hasOwnProperty(\"pointTwoY\")&&t.hasOwnProperty(\"pointTwoZ\"))return p(e.pointOneX,e.pointOneY,e.pointOneZ,t.pointTwoX,t.pointTwoY,t.pointTwoZ);throw new TypeError(\"Key names do not match\")}throw new TypeError(\"Invalid Arguments: Try again\")},Array:function(e){if(!u(e))throw new TypeError(\"Incorrect array format entered for pairwise distance calculation\");return m(e)}}));return h}function i(e){return e.constructor!==Array&&(e=s(e)),\"number\"==typeof e[0]&&\"number\"==typeof e[1]}function a(e){return e.constructor!==Array&&(e=s(e)),\"number\"==typeof e[0]&&\"number\"==typeof e[1]&&\"number\"==typeof e[2]}function o(e){return e.constructor!==Array&&(e=s(e)),\"number\"==typeof e[0]&&\"number\"==typeof e[1]&&\"number\"==typeof e[2]&&\"number\"==typeof e[3]&&\"number\"==typeof e[4]&&\"number\"==typeof e[5]}function s(e){for(var t=Object.keys(e),r=[],n=0;n<t.length;n++)r.push(e[t[n]]);return r}function u(e){if(2==e[0].length&&\"number\"==typeof e[0][0]&&\"number\"==typeof e[0][1]){for(var t in e)if(2!=e[t].length||\"number\"!=typeof e[t][0]||\"number\"!=typeof e[t][1])return!1}else{if(3!=e[0].length||\"number\"!=typeof e[0][0]||\"number\"!=typeof e[0][1]||\"number\"!=typeof e[0][2])return!1;for(var t in e)if(3!=e[t].length||\"number\"!=typeof e[t][0]||\"number\"!=typeof e[t][1]||\"number\"!=typeof e[t][2])return!1}return!0}function c(e,t,r,n,i){var a=Math.abs(r*e+n*t+i),o=Math.pow(r*r+n*n,.5),s=a/o;return s}function f(e,t,r,n,i,a,o,s,u){var c=[(i-t)*u-(a-r)*s,(a-r)*o-(n-e)*u,(n-e)*s-(i-t)*o];c=Math.pow(c[0]*c[0]+c[1]*c[1]+c[2]*c[2],.5);var f=Math.pow(o*o+s*s+u*u,.5),l=c/f;return l}function l(e,t,r,n){var i=n-t,a=r-e,o=i*i+a*a,s=Math.pow(o,.5);return s}function p(e,t,r,n,i,a){var o=a-r,s=i-t,u=n-e,c=o*o+s*s+u*u,f=Math.pow(c,.5);return f}function m(e){for(var t=[],r=0;r<e.length-1;r++)for(var n=r+1;n<e.length;n++)2==e[0].length?t.push(l(e[r][0],e[r][1],e[n][0],e[n][1])):3==e[0].length&&t.push(p(e[r][0],e[r][1],e[r][2],e[n][0],e[n][1],e[n][2]));return t}t.name=\"distance\",t.factory=n},function(e,t,r){e.exports=[r(408),r(409),r(410),r(411)]},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=r(30),o=n(r(51)),s=n(r(368)),u=n(r(409)),c=n(r(347)),f=n(r(360)),l=n(r(298)),p=n(r(56)),m=n(r(57)),h=i(\"and\",{\"number, number\":function(e,t){return!(!e||!t)},\"Complex, Complex\":function(e,t){return!(0===e.re&&0===e.im||0===t.re&&0===t.im)},\"BigNumber, BigNumber\":function(e,t){return!(e.isZero()||t.isZero()||e.isNaN()||t.isNaN())},\"Unit, Unit\":function(e,t){return 0!==e.value&&null!==e.value&&0!==t.value&&null!==t.value},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=f(e,t,h,!1);break;default:r=c(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=p(e,t,h)}}return r},\"Array, Array\":function(e,t){return h(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(o(e),t)},\"Matrix, Array\":function(e,t){return h(e,o(t))},\"Matrix, any\":function(e,t){if(u(t))return s(e.size(),e.storage());var r;switch(e.storage()){case\"sparse\":r=l(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){if(u(e))return s(e.size(),e.storage());var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, any\":function(e,t){return h(o(e),t).valueOf()},\"any, Array\":function(e,t){return h(e,o(t)).valueOf()}});return h.toTex=\"\\\\left(${args[0]}\"+a.operators.and+\"${args[1]}\\\\right)\",h}t.name=\"and\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=r(30),s=a(\"not\",{number:function(e){return!e},Complex:function(e){return 0===e.re&&0===e.im},BigNumber:function(e){return e.isZero()||e.isNaN()},Unit:function(e){return null===e.value||0==e.value},\"Array | Matrix\":function(e){return i(e,s)}});return s.toTex=o.operators.not+\"\\\\left(${args[0]}\\\\right)\",s}var i=r(19);t.name=\"not\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=r(30),o=n(r(51)),s=n(r(60)),u=n(r(303)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=i(\"or\",{\"number, number\":function(e,t){return!(!e&&!t)},\"Complex, Complex\":function(e,t){return 0!==e.re||0!==e.im||0!==t.re||0!==t.im},\"BigNumber, BigNumber\":function(e,t){return!e.isZero()&&!e.isNaN()||!t.isZero()&&!t.isNaN()},\"Unit, Unit\":function(e,t){return 0!==e.value&&null!==e.value||0!==t.value&&null!==t.value},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,p);break;default:r=s(t,e,p,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,p,!1);break;default:r=f(e,t,p)}}return r},\"Array, Array\":function(e,t){return p(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return p(o(e),t)},\"Matrix, Array\":function(e,t){return p(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,p,!1);break;default:r=l(e,t,p,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,p,!0);break;default:r=l(t,e,p,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,p,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,p,!0).valueOf()}});return p.toTex=\"\\\\left(${args[0]}\"+a.operators.or+\"${args[1]}\\\\right)\",p}t.name=\"or\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=r(30),o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=i(\"xor\",{\"number, number\":function(e,t){return!!(!!e^!!t)},\"Complex, Complex\":function(e,t){return!!((0!==e.re||0!==e.im)^(0!==t.re||0!==t.im))},\"BigNumber, BigNumber\":function(e,t){return!!((!e.isZero()&&!e.isNaN())^(!t.isZero()&&!t.isNaN()))},\"Unit, Unit\":function(e,t){return!!((0!==e.value&&null!==e.value)^(0!==t.value&&null!==t.value))},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,p);break;default:r=s(t,e,p,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,p,!1);break;default:r=f(e,t,p)}}return r},\"Array, Array\":function(e,t){return p(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return p(o(e),t)},\"Matrix, Array\":function(e,t){return p(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,p,!1);break;default:r=l(e,t,p,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,p,!0);break;default:r=l(t,e,p,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,p,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,p,!0).valueOf()}});return p.toTex=\"\\\\left(${args[0]}\"+a.operators.xor+\"${args[1]}\\\\right)\",p}t.name=\"xor\",t.factory=n},function(e,t,r){e.exports=[r(279),r(413),r(301),r(414),r(415),r(304),r(416),r(299),r(417),r(308),r(418),r(419),r(420),r(310),r(365),r(322),r(368)]},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t){var r=i(e),n=i(t);if(1!=r.length||1!=n.length||3!=r[0]||3!=n[0])throw new RangeError(\"Vectors with length 3 expected (Size A = [\"+r.join(\", \")+\"], B = [\"+n.join(\", \")+\"])\");return[u(c(e[1],t[2]),c(e[2],t[1])),u(c(e[2],t[0]),c(e[0],t[2])),u(c(e[0],t[1]),c(e[1],t[0]))]}var s=n(r(51)),u=n(r(302)),c=n(r(296)),f=a(\"cross\",{\"Matrix, Matrix\":function(e,t){return s(o(e.toArray(),t.toArray()))},\"Matrix, Array\":function(e,t){return s(o(e.toArray(),t))},\"Array, Matrix\":function(e,t){return s(o(e,t.toArray()))},\"Array, Array\":o});return f.toTex=\"\\\\left(${args[0]}\\\\right)\\\\times\\\\left(${args[1]}\\\\right)\",f}var i=r(40).size;t.name=\"cross\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){function u(e,t,r,n){if(!o(t))throw new TypeError(\"Second parameter in function diag must be an integer\");var i=t>0?t:0,a=0>t?-t:0;switch(r.length){case 1:return c(e,t,n,r[0],a,i);case 2:return f(e,t,n,r,a,i)}throw new RangeError(\"Matrix for function diag must be 2 dimensional\")}function c(t,r,n,i,a,o){var s=[i+a,i+o],u=e.Matrix.storage(n||\"dense\"),c=u.diagonal(s,t,r);return null!==n?c:c.valueOf()}function f(e,t,r,n,i,o){if(e&&e.isMatrix===!0){var s=e.diagonal(t);return null!==r?r!==s.storage()?l(s,r):s:s.valueOf()}for(var u=Math.min(n[0]-i,n[1]-o),c=[],f=0;u>f;f++)c[f]=a(e[f+i][f+o]);return null!==r?l(c):c}var l=n(r(51)),p=s(\"diag\",{Array:function(e){return u(e,0,i.size(e),null)},\"Array, number\":function(e,t){return u(e,t,i.size(e),null)},\"Array, BigNumber\":function(e,t){return u(e,t.toNumber(),i.size(e),null)},\"Array, string\":function(e,t){return u(e,0,i.size(e),t)},\"Array, number, string\":function(e,t,r){return u(e,t,i.size(e),r)},\"Array, BigNumber, string\":function(e,t,r){return u(e,t.toNumber(),i.size(e),r)},Matrix:function(e){return u(e,0,e.size(),e.storage())},\"Matrix, number\":function(e,t){return u(e,t,e.size(),e.storage())},\"Matrix, BigNumber\":function(e,t){return u(e,t.toNumber(),e.size(),e.storage())},\"Matrix, string\":function(e,t){return u(e,0,e.size(),t)},\"Matrix, number, string\":function(e,t,r){return u(e,t,e.size(),r)},\"Matrix, BigNumber, string\":function(e,t,r){return u(e,t.toNumber(),e.size(),r)}});return p.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",p}var i=r(40),a=r(3).clone,o=r(6).isInteger;t.name=\"diag\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t){var r=i(e),n=i(t),a=r[0];if(1!==r.length||1!==n.length)throw new RangeError(\"Vector expected\");if(r[0]!=n[0])throw new RangeError(\"Vectors must have equal length (\"+r[0]+\" != \"+n[0]+\")\");if(0==a)throw new RangeError(\"Cannot calculate the dot product of empty vectors\");for(var o=0,c=0;a>c;c++)o=s(o,u(e[c],t[c]));return o}var s=n(r(50)),u=n(r(296)),c=a(\"dot\",{\"Matrix, Matrix\":function(e,t){return o(e.toArray(),t.toArray())},\"Matrix, Array\":function(e,t){return o(e.toArray(),t)},\"Array, Matrix\":function(e,t){return o(e,t.toArray())},\"Array, Array\":o});return c.toTex=\"\\\\left(${args[0]}\\\\cdot${args[1]}\\\\right)\",c}var i=r(40).size;t.name=\"dot\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(51)),u=o(\"flatten\",{Array:function(e){return a(i(e))},Matrix:function(e){var t=a(i(e.toArray()));return s(t)}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}var i=r(3).clone,a=r(40).flatten;t.name=\"flatten\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t,r){var n=u(t),i=n?new e.BigNumber(1):1;if(c(t),r){var o=f(r);return t.length>0?o.resize(t,i):o}var s=[];return t.length>0?a(s,t,i):s}function u(e){var t=!1;return e.forEach(function(e,r,n){e&&e.isBigNumber===!0&&(t=!0,n[r]=e.toNumber())}),t}function c(e){e.forEach(function(e){if(\"number\"!=typeof e||!i(e)||0>e)throw new Error(\"Parameters in function ones must be positive integers\")})}var f=n(r(51)),l=o(\"ones\",{\"\":function(){return\"array\"===t.matrix?s([]):s([],\"default\")},\"...number | BigNumber | string\":function(e){var r=e[e.length-1];if(\"string\"==typeof r){var n=e.pop();return s(e,n)}return\"array\"===t.matrix?s(e):s(e,\"default\")},Array:s,Matrix:function(e){var t=e.storage();return s(e.valueOf(),t)},\"Array | Matrix, string\":function(e,t){return s(e.valueOf(),t)}});return l.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",l}var i=r(6).isInteger,a=r(40).resize;t.name=\"ones\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,f){function l(e,t,r){if(void 0!==r){if(\"string\"!=typeof r||1!==r.length)throw new TypeError(\"Single character expected as defaultValue\")}else r=\" \";if(1!==t.length)throw new i(t.length,1);var n=t[0];if(\"number\"!=typeof n||!o(n))throw new TypeError(\"Invalid size, must contain positive integers (size: \"+s(t)+\")\");if(e.length>n)return e.substring(0,n);if(e.length<n){for(var a=e,u=0,c=n-e.length;c>u;u++)a+=r;return a}return e}var p=n(r(51)),m=function(e,r,n){if(2!=arguments.length&&3!=arguments.length)throw new a(\"resize\",arguments.length,2,3);if(r&&r.isMatrix===!0&&(r=r.valueOf()),r.length&&r[0]&&r[0].isBigNumber===!0&&(r=r.map(function(e){return e&&e.isBigNumber===!0?e.toNumber():e})),e&&e.isMatrix===!0)return e.resize(r,n,!0);if(\"string\"==typeof e)return l(e,r,n);var i=Array.isArray(e)?!1:\"array\"!==t.matrix;if(0==r.length){for(;Array.isArray(e);)e=e[0];return u(e)}Array.isArray(e)||(e=[e]),e=u(e);var o=c.resize(e,r,n);return i?p(o):o};return m.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",m}var i=r(42),a=r(11),o=r(6).isInteger,s=r(23).format,u=r(3).clone,c=r(40);t.name=\"resize\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=a(\"size\",{Matrix:function(e){return o(e.size())},Array:i.size,string:function(e){return\"array\"===t.matrix?[e.length]:o([e.length])},\"number | Complex | BigNumber | Unit | boolean | null\":function(e){return\"array\"===t.matrix?[]:o([])}});return s.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",s}var i=r(40);t.name=\"size\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(51)),u=o(\"squeeze\",{Array:function(e){return a.squeeze(i.clone(e))},Matrix:function(e){var t=a.squeeze(e.toArray());return Array.isArray(t)?s(t):t},any:function(e){return i.clone(e)}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}var i=r(3),a=r(40);t.name=\"squeeze\",t.factory=n},function(e,t,r){e.exports=[r(394),r(392),r(393),r(422),r(425),r(426),r(427),r(429),r(430)]},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){var r=t.size().length,n=e.size().length;if(r>1)throw new Error(\"first object must be one dimensional\");if(n>1)throw new Error(\"second object must be one dimensional\");if(r!==n)throw new Error(\"Length of two vectors must be equal\");var i=u(e);if(0===i)throw new Error(\"Sum of elements in first object must be non zero\");var a=u(t);if(0===a)throw new Error(\"Sum of elements in second object must be non zero\");var o=s(e,u(e)),m=s(t,u(t)),h=u(c(o,l(f(o,m))));return p(h)?h:Number.NaN}var o=n(r(51)),s=n(r(294)),u=n(r(423)),c=n(r(296)),f=n(r(346)),l=n(r(352)),p=n(r(424)),m=i(\"kldivergence\",{\"Array, Array\":function(e,t){return a(o(e),o(t))},\"Matrix, Array\":function(e,t){return a(e,o(t))},\"Array, Matrix\":function(e,t){return a(o(e),t)},\"Matrix, Matrix\":function(e,t){return a(e,t)}});return m}t.name=\"kldivergence\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(r){var n=void 0;if(i(r,function(e){n=void 0===n?e:s(n,e)}),void 0===n)switch(t.number){case\"number\":return 0;case\"bignumber\":return new e.BigNumber(0);case\"fraction\":return new e.Fraction(0);default:return 0}return n}var s=n(r(52)),u=a(\"sum\",{\"Array | Matrix\":function(e){return o(e)},\"Array | Matrix, number | BigNumber\":function(){throw new Error(\"sum(A, dim) is not yet supported\")},\"...\":function(){return o(arguments)}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}var i=r(290);t.name=\"sum\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"isNumeric\",{\"number | BigNumber | Fraction | boolean\":function(){return!0},\"Complex | Unit | string\":function(){return!1},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);r(6);t.name=\"isNumeric\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(50)),s=n(r(296)),u=n(r(294)),c=n(r(392)),f=n(r(396)),l=n(r(358));return a(\"multinomial\",{\"Array | Matrix\":function(e){var t=0,r=1;return i(e,function(e){if(!f(e)||!l(e))throw new TypeError(\"Positive integer value expected in function multinomial\");t=o(t,e),r=s(r,c(e))}),u(c(t),r)}})}var i=r(290);t.name=\"multinomial\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=n(r(392)),u=o(\"permutations\",{\"number | BigNumber\":s,\"number, number\":function(e,t){var r,n;if(!a(e)||0>e)throw new TypeError(\"Positive integer value expected in function permutations\");if(!a(t)||0>t)throw new TypeError(\"Positive integer value expected in function permutations\");if(t>e)throw new TypeError(\"second argument k must be less than or equal to first argument n\");for(r=1,n=e-t+1;e>=n;n++)r*=n;return r},\"BigNumber, BigNumber\":function(t,r){var n,a;if(!i(t)||!i(r))throw new TypeError(\"Positive integer value expected in function permutations\");if(r.gt(t))throw new TypeError(\"second argument k must be less than or equal to first argument n\");for(n=new e.BigNumber(1),a=t.minus(r).plus(1);a.lte(t);a=a.plus(1))n=n.times(a);return n}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}function i(e){return e.isInteger()&&e.gte(0)}var a=r(6).isInteger;t.name=\"permutations\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(428)),o=a(\"uniform\").pickRandom;return o.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",o}t.name=\"pickRandom\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e){if(!f.hasOwnProperty(e))throw new Error(\"Unknown distribution \"+e);var t=Array.prototype.slice.call(arguments,1),r=f[e].apply(this,t);return function(e){var t={random:function(e,t,n){var s,c,f;if(arguments.length>3)throw new i(\"random\",arguments.length,0,3);if(1===arguments.length?a(e)?s=e:f=e:2===arguments.length?a(e)?(s=e,f=t):(c=e,f=t):(s=e,c=t,f=n),void 0===f&&(f=1),void 0===c&&(c=0),void 0!==s){var l=o(s.valueOf(),c,f,r);return s&&s.isMatrix===!0?u(l):l}return r(c,f)},randomInt:function(e,t,r){var s,c,f;if(arguments.length>3||arguments.length<1)throw new i(\"randomInt\",arguments.length,1,3);if(1===arguments.length?a(e)?s=e:f=e:2===arguments.length?a(e)?(s=e,f=t):(c=e,f=t):(s=e,c=t,f=r),void 0===c&&(c=0),void 0!==s){var l=o(s.valueOf(),c,f,n);return s&&s.isMatrix===!0?u(l):l}return n(c,f)},pickRandom:function(e){if(1!==arguments.length)throw new i(\"pickRandom\",arguments.length,1);if(e&&e.isMatrix===!0)e=e.valueOf();else if(!Array.isArray(e))throw new TypeError(\"Unsupported type of value in function pickRandom\");if(c.size(e).length>1)throw new Error(\"Only one dimensional vectors supported\");return e[Math.floor(Math.random()*e.length)]}},r=function(t,r){return t+e()*(r-t)},n=function(t,r){return Math.floor(t+e()*(r-t))},o=function(e,t,r,n){var i,a,s=[];if(e=e.slice(0),e.length>1)for(a=0,i=e.shift();i>a;a++)s.push(o(e,t,r,n));else for(a=0,i=e.shift();i>a;a++)s.push(n(t,r));return s};return t}(r)}var u=n(r(51)),c=r(40),f={uniform:function(){return Math.random},normal:function(){return function(){for(var e,t,r=-1;0>r||r>1;)e=Math.random(),t=Math.random(),r=1/6*Math.pow(-2*Math.log(e),.5)*Math.cos(2*Math.PI*t)+.5;return r}}};return s.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",s}var i=r(11),a=r(288);t.name=\"distribution\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(428)),o=a(\"uniform\").random;return o.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",o}t.name=\"random\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(428)),o=a(\"uniform\").randomInt;return o.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",o}t.name=\"randomInt\",t.factory=n},function(e,t,r){e.exports=[r(432),r(433),r(434),r(63),r(329),r(59),r(435),r(436)]},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(303)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=a(\"compare\",{\"boolean, boolean\":function(e,t){return e===t?0:e>t?1:-1},\"number, number\":function(e,r){return e===r||i(e,r,t.epsilon)?0:e>r?1:-1},\"BigNumber, BigNumber\":function(t,r){return new e.BigNumber(t.cmp(r))},\"Fraction, Fraction\":function(t,r){return new e.Fraction(t.compare(r))},\"Complex, Complex\":function(){throw new TypeError(\"No ordering relation is defined for complex numbers\")},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value===r.value||i(e.value,r.value,t.epsilon)?0:e.value>r.value?1:-1},\"string, string\":function(e,t){return e===t?0:e>t?1:-1},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,p);break;default:r=s(t,e,p,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,p,!1);break;default:r=f(e,t,p)}}return r},\"Array, Array\":function(e,t){return p(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return p(o(e),t)},\"Matrix, Array\":function(e,t){return p(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,p,!1);break;default:r=l(e,t,p,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,p,!0);break;default:r=l(t,e,p,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,p,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,p,!0).valueOf()}});return p.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",p}var i=r(6).nearlyEqual;t.name=\"compare\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){if(Array.isArray(e)){if(Array.isArray(t)){var r=e.length;if(r!==t.length)return!1;for(var n=0;r>n;n++)if(!a(e[n],t[n]))return!1;return!0}return!1}return Array.isArray(t)?!1:o(e,t)}var o=n(r(434)),s=i(\"deepEqual\",{\"any, any\":function(e,t){return a(e.valueOf(),t.valueOf())}});return s.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",s}t.name=\"deepEqual\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=n(r(51)),o=n(r(48)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=i(\"equal\",{\"any, any\":function(e,t){return null===e?null===t:null===t?null===e:void 0===e?void 0===t:void 0===t?void 0===e:o(e,t)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,o);break;default:r=s(t,e,o,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,o,!1);break;default:r=f(e,t,o)}}return r},\"Array, Array\":function(e,t){return m(a(e),a(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(a(e),t)},\"Matrix, Array\":function(e,t){return m(e,a(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,o,!1);break;default:r=l(e,t,o,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,o,!0);break;default:r=l(t,e,o,!0)}return r},\"Array, any\":function(e,t){return l(a(e),t,o,!1).valueOf()},\"any, Array\":function(e,t){return l(a(t),e,o,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.equal+\"${args[1]}\\\\right)\",m}t.name=\"equal\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=a(\"smallerEq\",{\"boolean, boolean\":function(e,t){return t>=e},\"number, number\":function(e,r){return r>=e||i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return e.lte(t)},\"Fraction, Fraction\":function(e,t){return 1!==e.compare(t)},\"Complex, Complex\":function(){throw new TypeError(\"No ordering relation is defined for complex numbers\");\n},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return e.value<=r.value||i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return t>=e},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,m);break;default:r=s(t,e,m,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,m,!1);break;default:r=f(e,t,m)}}return r},\"Array, Array\":function(e,t){return m(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(o(e),t)},\"Matrix, Array\":function(e,t){return m(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,m,!1);break;default:r=l(e,t,m,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,m,!0);break;default:r=l(t,e,m,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,m,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,m,!0).valueOf()}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.smallerEq+\"${args[1]}\\\\right)\",m}var i=r(6).nearlyEqual;t.name=\"smallerEq\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(60)),u=n(r(61)),c=n(r(62)),f=n(r(56)),l=n(r(57)),p=r(30),m=a(\"unequal\",{\"any, any\":function(e,t){return null===e?null!==t:null===t?null!==e:void 0===e?void 0!==t:void 0===t?void 0!==e:h(e,t)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=u(e,t,h);break;default:r=s(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=s(e,t,h,!1);break;default:r=f(e,t,h)}}return r},\"Array, Array\":function(e,t){return m(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return m(o(e),t)},\"Matrix, Array\":function(e,t){return m(e,o(t))},\"Matrix, any\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=l(e,t,h,!1)}return r},\"any, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=c(t,e,h,!0);break;default:r=l(t,e,h,!0)}return r},\"Array, any\":function(e,t){return l(o(e),t,h,!1).valueOf()},\"any, Array\":function(e,t){return l(o(t),e,h,!0).valueOf()}}),h=a(\"_unequal\",{\"boolean, boolean\":function(e,t){return e!==t},\"number, number\":function(e,r){return!i(e,r,t.epsilon)},\"BigNumber, BigNumber\":function(e,t){return!e.eq(t)},\"Fraction, Fraction\":function(e,t){return 0!==e.compare(t)},\"Complex, Complex\":function(e,r){return!i(e.re,r.re,t.epsilon)||!i(e.im,r.im,t.epsilon)},\"Unit, Unit\":function(e,r){if(!e.equalBase(r))throw new Error(\"Cannot compare units with different base\");return!i(e.value,r.value,t.epsilon)},\"string, string\":function(e,t){return e!==t}});return m.toTex=\"\\\\left(${args[0]}\"+p.operators.unequal+\"${args[1]}\\\\right)\",m}var i=r(6).nearlyEqual;t.name=\"unequal\",t.factory=n},function(e,t,r){e.exports=[r(289),r(293),r(438),r(306),r(440),r(441),r(442),r(443),r(423),r(444)]},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){e=i(e.valueOf());var t=e.length;if(0==t)throw new Error(\"Cannot calculate median of an empty array\");if(t%2==0){for(var r=t/2-1,n=f(e,r+1),a=e[r],o=0;r>o;++o)c(e[o],a)>0&&(a=e[o]);return m(a,n)}var s=f(e,(t-1)/2);return p(s)}var s=n(r(52)),u=n(r(295)),c=n(r(432)),f=n(r(439)),l=a(\"median\",{\"Array | Matrix\":o,\"Array | Matrix, number | BigNumber\":function(e,t){throw new Error(\"median(A, dim) is not yet supported\")},\"...\":function(){return o(Array.prototype.slice.call(arguments))}}),p=a({\"number | BigNumber | Unit\":function(e){return e}}),m=a({\"number | BigNumber | Unit, number | BigNumber | Unit\":function(e,t){return u(s(e,t),2)}});return l.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",l}var i=r(40).flatten;t.name=\"median\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e,t){return-c(e,t)}function s(e,t,r){if(!i(t)||0>t)throw new Error(\"k must be a non-negative integer\");if(e&&e.isMatrix){var n=e.size();if(n.length>1)throw new Error(\"Only one dimensional matrices supported\");return u(e.valueOf(),t,r)}return Array.isArray(e)?u(e,t,r):void 0}function u(e,t,r){if(t>=e.length)throw new Error(\"k out of bounds\");for(var n=0,i=e.length-1;i>n;){for(var a=n,o=i,s=e[Math.floor(Math.random()*(i-n+1))+n];o>a;)if(r(e[a],s)>=0){var u=e[o];e[o]=e[a],e[a]=u,--o}else++a;r(e[a],s)>0&&--a,a>=t?i=a:n=a+1}return e[t]}var c=n(r(432));return a(\"partitionSelect\",{\"Array | Matrix, number\":function(e,t){return s(e,t,c)},\"Array | Matrix, number, string\":function(e,t,r){if(\"asc\"===r)return s(e,t,c);if(\"desc\"===r)return s(e,t,o);throw new Error('Compare string must be \"asc\" or \"desc\"')},\"Array | Matrix, number, function\":s})}var i=r(6).isInteger;t.name=\"partitionSelect\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){function a(e){e=i(e.valueOf());var t=e.length;if(0==t)throw new Error(\"Cannot calculate mode of an empty array\");var r={},n=[],a=0;for(var o in e)e[o]in r||(r[e[o]]=0),r[e[o]]++,r[e[o]]==a?n.push(e[o]):r[e[o]]>a&&(a=r[e[o]],n=[e[o]]);return n}var o=n(\"mode\",{\"Array | Matrix\":a,\"...\":function(){return a(Array.prototype.slice.call(arguments))}});return o}var i=r(40).flatten;t.name=\"mode\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){var t=void 0;if(i(e,function(e){t=void 0===t?e:s(t,e)}),void 0===t)throw new Error(\"Cannot calculate prod of an empty array\");return t}var s=n(r(297)),u=a(\"prod\",{\"Array | Matrix\":o,\"Array | Matrix, number | BigNumber\":function(e,t){throw new Error(\"prod(A, dim) is not yet supported\")},\"...\":function(){return o(arguments)}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}var i=r(290);t.name=\"prod\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,u){function c(t,r,n){var o,u,c;if(arguments.length<2||arguments.length>3)throw new SyntaxError(\"Function quantileSeq requires two or three parameters\");if(s(t)){if(n=n||!1,\"boolean\"==typeof n){if(u=t.valueOf(),a(r)){if(0>r)throw new Error(\"N/prob must be non-negative\");if(1>=r)return f(u,r,n);if(r>1){if(!i(r))throw new Error(\"N must be a positive integer\");var l=r+1;o=new Array(r);for(var p=0;r>p;)o[p]=f(u,++p/l,n);return o}}if(r&&r.isBigNumber){if(r.isNegative())throw new Error(\"N/prob must be non-negative\");if(c=r.constructor.ONE,r.lte(c))return f(u,r,n);if(r.gt(c)){if(!r.isInteger())throw new Error(\"N must be a positive integer\");var m=r.toNumber();if(m>4294967295)throw new Error(\"N must be less than or equal to 2^32-1, as that is the maximum length of an Array\");var l=new e.BigNumber(m+1);o=new Array(m);for(var p=0;m>p;)o[p]=f(u,new e.BigNumber(++p).div(l),n);return o}}if(Array.isArray(r)){o=new Array(r.length);for(var p=0;p<o.length;++p){var h=r[p];if(a(h)){if(0>h||h>1)throw new Error(\"Probability must be between 0 and 1, inclusive\")}else{if(!h||!h.isBigNumber)throw new TypeError(\"Unexpected type of argument in function quantileSeq\");if(c=h.constructor.ONE,h.isNegative()||h.gt(c))throw new Error(\"Probability must be between 0 and 1, inclusive\")}o[p]=f(u,h,n)}return o}throw new TypeError(\"Unexpected type of argument in function quantileSeq\")}throw new TypeError(\"Unexpected type of argument in function quantileSeq\")}throw new TypeError(\"Unexpected type of argument in function quantileSeq\")}function f(e,t,r){var n=o(e),i=n.length;if(0===i)throw new Error(\"Cannot calculate quantile of an empty sequence\");if(a(t)){var s=t*(i-1),u=s%1;if(0===u){var c=r?n[s]:m(n,s);return g(c),c}var f,v,d=Math.floor(s);if(r)f=n[d],v=n[d+1];else{v=m(n,d+1),f=n[d];for(var y=0;d>y;++y)h(n[y],f)>0&&(f=n[y])}return g(f),g(v),l(p(f,1-u),p(v,u))}var s=t.times(i-1);if(s.isInteger()){s=s.toNumber();var c=r?n[s]:m(n,s);return g(c),c}var f,v,d=s.floor(),u=s.minus(d),x=d.toNumber();if(r)f=n[x],v=n[x+1];else{v=m(n,x+1),f=n[x];for(var y=0;x>y;++y)h(n[y],f)>0&&(f=n[y])}g(f),g(v);var w=u.constructor.ONE;return l(p(f,w.minus(u)),p(v,u))}var l=n(r(50)),p=n(r(296)),m=n(r(439)),h=n(r(432)),g=u({\"number | BigNumber | Unit\":function(e){return e}});return c}var i=r(6).isInteger,a=r(6).isNumber,o=r(40).flatten,s=r(288);t.name=\"quantileSeq\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,i){function a(e,t){if(0==e.length)throw new SyntaxError(\"Function std requires one or more parameters (0 provided)\");return o(s.apply(null,arguments))}var o=n(r(357)),s=n(r(444)),u=i(\"std\",{\"Array | Matrix\":a,\"Array | Matrix, string\":a,\"...\":function(){return a(Array.prototype.slice.call(arguments))}});return u.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",u}t.name=\"std\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t,r){var n=0,i=0;if(0==t.length)throw new SyntaxError(\"Function var requires one or more parameters (0 provided)\");if(a(t,function(e){n=u(n,e),i++}),0===i)throw new Error(\"Cannot calculate var of an empty array\");var o=l(n,i);switch(n=0,a(t,function(e){var t=c(e,o);n=u(n,f(t,t))}),r){case\"uncorrected\":return l(n,i);case\"biased\":return l(n,i+1);case\"unbiased\":var s=n&&n.isBigNumber===!0?new e.BigNumber(0):0;return 1==i?s:l(n,i-1);default:throw new Error('Unknown normalization \"'+r+'\". Choose \"unbiased\" (default), \"uncorrected\", or \"biased\".')}}var u=n(r(52)),c=n(r(302)),f=n(r(297)),l=n(r(295)),p=o(\"variance\",{\"Array | Matrix\":function(e){return s(e,i)},\"Array | Matrix, string\":s,\"...\":function(){return s(arguments,i)}});return p.toTex=\"\\\\mathrm{Var}\\\\left(${args}\\\\right)\",p}var i=\"unbiased\",a=r(290);t.name=\"var\",t.factory=n},function(e,t,r){e.exports=[r(446),r(456),r(458),r(460),r(463),r(465),r(467),r(468),r(464),r(466),r(459),r(469),r(462),r(471),r(472),r(475),r(477),r(479),r(480),r(481),r(482),r(483),r(474),r(484),r(485)]},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t){var r=new e.Complex(t.im*t.im-t.re*t.re+1,-2*t.re*t.im),n=u(r),i=new e.Complex(n.re-t.im,n.im+t.re),a=c(i);return new e.Complex(1.5707963267948966-a.im,a.re)}var u=o.find(n(r(357)),[\"Complex\"]),c=o.find(n(r(352)),[\"Complex\"]),f=o(\"acos\",{number:function(r){return r>=-1&&1>=r||t.predictable?Math.acos(r):s(new e.Complex(r,0))},Complex:s,BigNumber:function(t){return a(t,e.BigNumber,!1)},\"Array | Matrix\":function(e){return i(e,f)}});return f.toTex=\"\\\\cos^{-1}\\\\left(${args[0]}\\\\right)\",f}var i=r(19),a=r(447);t.name=\"acos\",t.factory=n},function(e,t,r){var n=r(77).pi,i=r(448);e.exports=function(e,t,r){if(r){if(e.abs().lt(t.ONE))throw new Error(\"asec() only has non-complex values for |x| >= 1.\")}else if(e.abs().gt(t.ONE))throw new Error(\"acos() only has non-complex values for |x| <= 1.\");if(e.eq(-1))return n(t);var a=t.precision;t.config({precision:a+4}),r&&(e=t.ONE.div(e));var o=i(t.ONE.minus(e.times(e)).sqrt().div(e.plus(t.ONE)),t).times(2);return t.config({precision:a}),o.toDP(a-1)}},function(e,t,r){var n=r(77),i=r(449),a=r(78);e.exports=function(e,t,r){if(e.isNaN())return new t(NaN);if(!r&&e.isZero()||r&&!e.isFinite())return new t(0);var o=t.precision;if(!r&&!e.isFinite()||r&&e.isZero()){var s=n.pi(t.constructor({precision:o+2})).div(2).toDP(o-1);return s.constructor=t,s.s=e.s,s}t.config({precision:o+4}),r&&(e=t.ONE.div(e));var u=e.abs();if(u.lte(.875)){var c=a(e);return c.constructor=t,t.config({precision:o}),c.toDP(t.precision-1)}if(u.gte(1.143)){var s=n.pi(t.constructor({precision:o+4})).div(2),c=s.minus(a(t.ONE.div(u)));return c.s=e.s,c.constructor=t,t.config({precision:o}),c.toDP(t.precision-1)}return e=e.div(e.times(e).plus(1).sqrt()),t.config({precision:o}),i(e,t)}},function(e,t,r){var n=r(77).pi,i=r(450),a=r(451);e.exports=function o(e,t,r){if(e.isNaN())return new t(NaN);var s=t.precision,u=e.abs();if(r){if(u.lt(t.ONE))throw new Error(\"acsc() only has non-complex values for |x| >= 1.\");t.config({precision:s+2}),e=t.ONE.div(e),t.config({precision:s}),u=e.abs()}else if(u.gt(t.ONE))throw new Error(\"asin() only has non-complex values for |x| <= 1.\");if(u.gt(.8)){t.config({precision:s+4});var c=e.s,f=n(t.constructor({precision:s+4})).div(2);return e=f.minus(o(t.ONE.minus(e.times(e)).sqrt(),t)),e.s=c,e.constructor=t,t.config({precision:s}),e.toDP(s-1)}var l=u.gt(.58);l&&(t.config({precision:s+8}),e=e.div(new t(2).sqrt().times(t.ONE.minus(e.times(e)).sqrt().plus(t.ONE).sqrt())),t.config({precision:s}));var p=60>=s||e.dp()<=Math.log(s)&&e.lt(.05)?i(e,s):a(e,t);return l?p.times(2):p}},function(e,t){e.exports=function(e,t){var r=e.constructor;r.config({precision:t+Math.log(t)|4});for(var n=new r(1),i=e,a=NaN,o=e.times(e),s=e,u=new r(n),c=new r(n),f=new r(n),l=3;!i.equals(a);l+=2)s=s.times(o),u=u.times(f),c=c.times(f.plus(n)),a=i,f=new r(l),i=i.plus(s.times(u).div(f.times(c)));return r.config({precision:t}),i.toDP(t-1)}},function(e,t,r){var n=r(452),i=r(455);e.exports=function(e,t){var r=t.precision,a=-(r+4),o=r+8-e.e,s=25-e.e,u=Math.max(1.442695*Math.log(r+2)|5,5);t.config({precision:s});var c=0,f=new t(Math.asin(e.toNumber())+\"\");do{var l=n(f,t,1,!1),p=i(l);l.isZero()||(l.s=f.s);var m=l.minus(e).div(p);f=f.minus(m),s=Math.min(2*s,o),t.config({precision:s})}while(2*m.e>=a&&!m.isZero()&&++c<=u);if(c==u)throw new Error(\"asin() failed to converge to the requested accuracy.Try with a higher precision.\");return t.config({precision:r}),f.toDP(r-1)}},function(e,t,r){var n=r(453),i=r(454);e.exports=function(e,t,r,a){if(e.isNaN()||!e.isFinite())return new t(NaN);var o=t.precision,s=new t(e),u=s.isNegative();u&&(s.s=-s.s);var c=o+(0|Math.log(o))+3;if(t.config({precision:c}),s=n(s,t.constructor({precision:c}),r),s[0].constructor=t,s[1])return s=s[0],a&&s.isZero()&&(s=new t(1/0)),t.config({precision:o}),s;var f;if(s=s[0],r){f=i(s.div(3125),r),t.config({precision:Math.min(c,o+15)});for(var l=new t(5),p=new t(16),m=new t(20),h=0;5>h;++h){var g=f.times(f),v=g.times(f),d=v.times(g);f=p.times(d).minus(m.times(v)).plus(l.times(f))}u&&(f.s=-f.s)}else{var y,x;s.abs().lt(t.ONE)?(y=64,x=3):(y=256,x=4),f=i(s.div(y),r),t.config({precision:Math.min(c,o+8)});for(var w=new t(8);x>0;--x){var g=f.times(f),b=g.times(g);f=w.times(b.minus(g)).plus(t.ONE)}}return a&&(f=f.e<=-o?new t(1/0):t.ONE.div(f)),t.config({precision:o}),f.toDP(o-1)}},function(e,t,r){var n=r(77);e.exports=function(e,t,r){var i=n.pi(t.constructor({precision:t.precision+2})),a=n.tau(t);if(e.abs().lte(i.toDP(e.dp())))return[e,!1];if(e.dp()>0&&e.div(i.toDP(e.dp())).toNumber()%2==0)return[new t(1^r),!0];var o=e.mod(a);return e.dp()>0&&o.toDP(e.dp(),1).isZero()?[new t(1^r),!0]:(o.gt(i)&&(r?(o=o.minus(i),o.s=-o.s):o=a.minus(o)),o.constructor=e.constructor,[o,!1])}},function(e,t){e.exports=function(e,t){for(var r=e.constructor.ONE,n=e,i=NaN,a=e.times(e),o=t?n:n=r,s=r,u=!0,c=t;!n.equals(i);c+=2)o=o.times(a),s=s.times(c+1).times(c+2),i=n,u=!u,n=u?n.plus(o.div(s)):n.minus(o.div(s));return n}},function(e,t){e.exports=function(e){var t=e.constructor,r=t.precision;t.config({precision:r+2});var n=t.ONE.minus(e.times(e)).sqrt();return t.config({precision:r}),n.toDP(r-1)}},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(e){var t,r=u(e);return r.im<=0?(t=r.re,r.re=-r.im,r.im=t):(t=r.im,r.im=-r.re,r.re=t),r}var u=o.find(n(r(446)),[\"Complex\"]),c=o(\"acosh\",{number:function(r){return r>=1||t.predictable?Math.log(Math.sqrt(r*r-1)+r):-1>=r?new e.Complex(Math.log(Math.sqrt(r*r-1)-r),Math.PI):s(new e.Complex(r,0))},Complex:s,BigNumber:function(t){return a(t,e.BigNumber,!1,!1)},\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=\"\\\\cosh^{-1}\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(457);t.name=\"acosh\",t.factory=n},function(e,t){e.exports=function(e,t,r,n){if(e.isNaN())return new t(NaN);if(n&&e.isZero())return new t(1/0);if(!r)if(n){if(e.isNegative()||e.gt(t.ONE))throw new Error(\"asech() only has non-complex values for 0 <= x <= 1.\")}else if(e.lt(t.ONE))throw new Error(\"acosh() only has non-complex values for x >= 1.\");var i=t.precision;t.config({precision:i+4});var a=new t(e);a.constructor=t,n&&(a=t.ONE.div(a));var o=r?a.times(a).plus(t.ONE):a.times(a).minus(t.ONE),s=a.plus(o.sqrt()).ln();return t.config({precision:i}),new t(s.toPrecision(i))}},function(e,t,r){\"use strict\";function n(e,t,n,s){var u=s.find(n(r(459)),[\"Complex\"]),c=s(\"acot\",{number:function(e){return e?Math.atan(1/e):o},Complex:function(t){if(0==t.im)return new e.Complex(t.re?Math.atan(1/t.re):o,0);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re=t.re/r,t.im=-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),u(t)},BigNumber:function(t){return a(t,e.BigNumber,!0)},\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=\"\\\\cot^{-1}\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(448),o=1.5707963267948966;t.name=\"acot\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=o.find(n(r(352)),[\"Complex\"]),u=o(\"atan\",{number:function(e){return Math.atan(e)},Complex:function(t){if(0==t.re){if(1==t.im)return new e.Complex(0,1/0);if(-1==t.im)return new e.Complex(0,-(1/0))}var r=t.re,n=t.im,i=r*r+(1-n)*(1-n),a=new e.Complex((1-n*n-r*r)/i,-2*r/i),o=s(a);return new e.Complex(-.5*o.im,.5*o.re)},BigNumber:function(t){return a(t,e.BigNumber,!1)},\"Array | Matrix\":function(e){return i(e,u,!0)}});return u.toTex=\"\\\\tan^{-1}\\\\left(${args[0]}\\\\right)\",u}var i=r(19),a=r(448);t.name=\"atan\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){function u(t){if(0==t.re&&0==t.im)return new e.Complex(0,o);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re/r,-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),c(t)}var c=s.find(n(r(462)),[\"Complex\"]),f=s(\"acoth\",{number:function(r){return r>=1||-1>=r||t.predictable?isFinite(r)?(Math.log((r+1)/r)+Math.log(r/(r-1)))/2:0:0!==r?u(new e.Complex(r,0)):new e.Complex(0,o)},Complex:u,BigNumber:function(t){return a(t,e.BigNumber,!0)},\"Array | Matrix\":function(e){return i(e,f)}});return f.toTex=\"\\\\coth^{-1}\\\\left(${args[0]}\\\\right)\",f}var i=r(19),a=r(461),o=1.5707963267948966;t.name=\"acoth\",t.factory=n},function(e,t){e.exports=function(e,t,r){if(e.isNaN())return new t(NaN);var n=e.abs();if(n.eq(t.ONE))return new t(e.isNegative()?-(1/0):1/0);if(n.gt(t.ONE)){if(!r)throw new Error(\"atanh() only has non-complex values for |x| <= 1.\")}else if(r)throw new Error(\"acoth() has complex values for |x| < 1.\");if(e.isZero())return new t(0);var i=t.precision;t.config({precision:i+4});var a=new t(e);a.constructor=t,r&&(a=t.ONE.div(a));var o=t.ONE.plus(a).div(t.ONE.minus(a)).ln().div(2);return t.config({precision:i}),new t(o.toPrecision(i))}},function(e,t,r){\"use strict\";function n(e,t,r,n){function o(t){var r=t.re>1&&0==t.im,n=1-t.re,i=1+t.re,a=n*n+t.im*t.im;t=0!=a?new e.Complex((i*n-t.im*t.im)/a,(t.im*n+i*t.im)/a):new e.Complex(-1!=t.re?t.re/0:0,0!=t.im?t.im/0:0);var o=t.re;return t.re=Math.log(Math.sqrt(t.re*t.re+t.im*t.im))/2,t.im=Math.atan2(t.im,o)/2,r&&(t.im=-t.im),t}var s=n(\"atanh\",{number:function(r){return 1>=r&&r>=-1||t.predictable?Math.log((1+r)/(1-r))/2:o(new e.Complex(r,0))},Complex:o,BigNumber:function(t){return a(t,e.BigNumber,!1)},\"Array | Matrix\":function(e){return i(e,s,!0)}});return s.toTex=\"\\\\tanh^{-1}\\\\left(${args[0]}\\\\right)\",s}var i=r(19),a=r(461);t.name=\"atanh\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,s){function u(t){if(0==t.re&&0==t.im)return new e.Complex(o,1/0);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re=t.re/r,t.im=-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),c(t)}var c=s.find(n(r(464)),[\"Complex\"]),f=s(\"acsc\",{number:function(r){return-1>=r||r>=1||t.predictable?Math.asin(1/r):u(new e.Complex(r,0))},Complex:u,BigNumber:function(t){return a(t,e.BigNumber,!0)},\"Array | Matrix\":function(e){return i(e,f)}});return f.toTex=\"\\\\csc^{-1}\\\\left(${args[0]}\\\\right)\",f}var i=r(19),a=r(449),o=1.5707963267948966;t.name=\"acsc\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t){var r=t.re,n=t.im,i=new e.Complex(n*n-r*r+1,-2*r*n),a=u(i),o=new e.Complex(a.re-n,a.im+r),s=c(o);return new e.Complex(s.im,-s.re)}var u=o.find(n(r(357)),[\"Complex\"]),c=o.find(n(r(352)),[\"Complex\"]),f=o(\"asin\",{number:function(r){return r>=-1&&1>=r||t.predictable?Math.asin(r):s(new e.Complex(r,0))},Complex:s,BigNumber:function(t){return a(t,e.BigNumber,!1)},\"Array | Matrix\":function(e){return i(e,f,!0)}});return f.toTex=\"\\\\sin^{-1}\\\\left(${args[0]}\\\\right)\",f}var i=r(19),a=r(449);t.name=\"asin\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=o.find(n(r(466)),[\"Complex\"]),u=o(\"acsch\",{number:function(e){return e=1/e,Math.log(e+Math.sqrt(e*e+1))},Complex:function(t){if(0==t.im)return t=0!=t.re?Math.log(t.re+Math.sqrt(t.re*t.re+1)):1/0,new e.Complex(t,0);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re/r,-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),s(t)},BigNumber:function(t){return a(t,e.BigNumber,!0,!0)},\"Array | Matrix\":function(e){return i(e,u)}});return u.toTex=\"\\\\mathrm{csch}^{-1}\\\\left(${args[0]}\\\\right)\",u}var i=r(19),a=r(457);t.name=\"acsch\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=o.find(n(r(464)),[\"Complex\"]),u=o(\"asinh\",{number:function(e){return Math.log(Math.sqrt(e*e+1)+e)},Complex:function(e){var t=e.im;e.im=-e.re,e.re=t;var r=s(e);return e.re=-e.im,e.im=t,t=r.re,r.re=-r.im,r.im=t,r},BigNumber:function(t){return a(t,e.BigNumber,!0,!1)},\"Array | Matrix\":function(e){return i(e,u,!0)}});return u.toTex=\"\\\\sinh^{-1}\\\\left(${args[0]}\\\\right)\",u}var i=r(19),a=r(457);t.name=\"asinh\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t){if(0==t.re&&0==t.im)return new e.Complex(0,1/0);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re=t.re/r,t.im=-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),u(t)}var u=o.find(n(r(446)),[\"Complex\"]),c=o(\"asec\",{number:function(r){return-1>=r||r>=1||t.predictable?Math.acos(1/r):s(new e.Complex(r,0))},Complex:s,BigNumber:function(t){return a(t,e.BigNumber,!0)},\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=\"\\\\sec^{-1}\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(447);t.name=\"asec\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){function s(t){if(0==t.re&&0==t.im)return new e.Complex(1/0,0);var r=t.re*t.re+t.im*t.im;return t=0!=r?new e.Complex(t.re/r,-t.im/r):new e.Complex(0!=t.re?t.re/0:0,0!=t.im?-(t.im/0):0),u(t)}var u=o.find(n(r(456)),[\"Complex\"]),c=o(\"asech\",{number:function(r){if(1>=r&&r>=-1||t.predictable){r=1/r;var n=Math.sqrt(r*r-1);return r>0||t.predictable?Math.log(n+r):new e.Complex(Math.log(n-r),Math.PI)}return s(new e.Complex(r,0))},Complex:s,BigNumber:function(t){return a(t,e.BigNumber,!1,!0)},\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=\"\\\\mathrm{sech}^{-1}\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(457);t.name=\"asech\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){var o=n(r(51)),s=n(r(347)),u=n(r(60)),c=n(r(349)),f=n(r(298)),l=n(r(62)),p=n(r(56)),m=n(r(57)),h=a(\"atan2\",{\"number, number\":Math.atan2,\"BigNumber, BigNumber\":function(t,r){return i(t,r,e.BigNumber)},\"Matrix, Matrix\":function(e,t){var r;switch(e.storage()){case\"sparse\":switch(t.storage()){case\"sparse\":r=c(e,t,h,!1);break;default:r=s(t,e,h,!0)}break;default:switch(t.storage()){case\"sparse\":r=u(e,t,h,!1);break;default:r=p(e,t,h)}}return r},\"Array, Array\":function(e,t){return h(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return h(o(e),t)},\"Matrix, Array\":function(e,t){return h(e,o(t))},\"Matrix, number | BigNumber\":function(e,t){var r;switch(e.storage()){case\"sparse\":r=f(e,t,h,!1);break;default:r=m(e,t,h,!1)}return r},\"number | BigNumber, Matrix\":function(e,t){var r;switch(t.storage()){case\"sparse\":r=l(t,e,h,!0);break;default:r=m(t,e,h,!0)}return r},\"Array, number | BigNumber\":function(e,t){return m(o(e),t,h,!1).valueOf()},\"number | BigNumber, Array\":function(e,t){return m(o(t),e,h,!0).valueOf()}});return h.toTex=\"\\\\mathrm{atan2}\\\\left(${args}\\\\right)\",h}var i=r(470);t.name=\"atan2\",t.factory=n},function(e,t,r){var n=r(77),i=r(448);e.exports=function(e,t,r){var a=r.precision;if(t.isZero()){if(e.isZero())return new r(NaN);var o=n.pi(r.constructor({precision:a+2})).div(2).toDP(a-1);return o.constructor=r,o.s=e.s,o}r.config({precision:a+2});var s=i(e.div(t),r,!1);if(t.isNegative()){var u=n.pi(r);s=e.isNegative()?s.minus(u):s.plus(u)}return s.constructor=r,r.config({precision:a}),s.toDP(a-1)}},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=o.find(n(r(472)),[\"number\"]),u=o.find(n(r(474)),[\"number\"]),c=o(\"cos\",{number:Math.cos,Complex:function(t){return new e.Complex(Math.cos(t.re)*s(-t.im),Math.sin(t.re)*u(-t.im))},BigNumber:function(t){return a(t,e.BigNumber,0,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function cos is no angle\");return Math.cos(t.value)},\"Array | Matrix\":function(e){return i(e,c)}});return c.toTex=\"\\\\cos\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(452);t.name=\"cos\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"cosh\",{number:i,Complex:function(t){var r=Math.exp(t.re),n=Math.exp(-t.re);return new e.Complex(Math.cos(t.im)*(r+n)/2,Math.sin(t.im)*(r-n)/2)},BigNumber:function(t){return o(t,e.BigNumber,!1,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function cosh is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s)}});return s.toTex=\"\\\\cosh\\\\left(${args[0]}\\\\right)\",s}function i(e){return(Math.exp(e)+Math.exp(-e))/2}var a=r(19),o=r(473);t.name=\"cosh\",t.factory=n},function(e,t){e.exports=function(e,t,r,n){if(e.isNaN())return new t(NaN);if(!e.isFinite())return new t(n?0:r?e:1/0);var i=t.precision;t.config({precision:i+4});var a=new t(e);return a.constructor=t,a=a.exp(),a=r?a.minus(t.ONE.div(a)):a.plus(t.ONE.div(a)),a=n?new t(2).div(a):a.div(2),t.config({precision:i}),new t(a.toPrecision(i))}},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"sinh\",{number:i,Complex:function(t){var r=Math.cos(t.im),n=Math.sin(t.im),i=Math.exp(t.re),a=Math.exp(-t.re);return new e.Complex(r*(i-a)/2,n*(i+a)/2)},BigNumber:function(t){return o(t,e.BigNumber,!0,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function sinh is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s,!0)}});return s.toTex=\"\\\\sinh\\\\left(${args[0]}\\\\right)\",s}function i(e){return Math.abs(e)<1?e+e*e*e/6+e*e*e*e*e/120:(Math.exp(e)-Math.exp(-e))/2}var a=r(19),o=r(473);t.name=\"sinh\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"cot\",{number:function(e){return 1/Math.tan(e)},Complex:function(t){var r=Math.exp(-4*t.im)-2*Math.exp(-2*t.im)*Math.cos(2*t.re)+1;return new e.Complex(2*Math.exp(-2*t.im)*Math.sin(2*t.re)/r,(Math.exp(-4*t.im)-1)/r)},BigNumber:function(t){return a(t,e.BigNumber,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function cot is no angle\");return 1/Math.tan(t.value)},\"Array | Matrix\":function(e){return i(e,o)}});return o.toTex=\"\\\\cot\\\\left(${args[0]}\\\\right)\",o}var i=r(19),a=r(476);t.name=\"cot\",t.factory=n},function(e,t,r){var n=r(77),i=r(452),a=r(455),o=r(453);e.exports=function(e,t,r){if(e.isNaN())return new t(NaN);var s=t.precision,u=n.pi(t.constructor({precision:s+2})),c=u.div(2).toDP(s-1);u=u.toDP(s-1);var f=o(e,t,1)[0];if(f.abs().eq(u))return new t(1/0);t.config({precision:s+4});var l=i(f,t,1,!1),p=a(l);l=l.toDP(s),p=p.toDP(s),f.eq(e)?f.gt(c)&&(p.s=-p.s):u.minus(f.abs()).gt(c)&&(p.s=-p.s);var m=r?p.div(l):l.div(p);return t.config({precision:s}),new t(m.toPrecision(s))}},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"coth\",{number:i,Complex:function(t){var r=Math.exp(2*t.re),n=r*Math.cos(2*t.im),i=r*Math.sin(2*t.im),a=(n-1)*(n-1)+i*i;return new e.Complex(((n+1)*(n-1)+i*i)/a,-2*i/a)},BigNumber:function(t){return o(t,e.BigNumber,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function coth is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s)}});return s.toTex=\"\\\\coth\\\\left(${args[0]}\\\\right)\",s}function i(e){var t=Math.exp(2*e);return(t+1)/(t-1)}var a=r(19),o=r(478);t.name=\"coth\",t.factory=n},function(e,t){e.exports=function(e,t,r){if(e.isNaN())return new t(NaN);if(!e.isFinite())return new t(e.s);var n=t.precision;t.config({precision:n+4});var i=new t(e);i.constructor=t;var a=i.exp(),o=t.ONE.div(a),s=a.minus(o);return s=r?a.plus(o).div(s):s.div(a.plus(o)),t.config({precision:n}),s.toDP(n-1)}},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"csc\",{number:function(e){return 1/Math.sin(e)},Complex:function(t){var r=.25*(Math.exp(-2*t.im)+Math.exp(2*t.im))-.5*Math.cos(2*t.re);return new e.Complex(.5*Math.sin(t.re)*(Math.exp(-t.im)+Math.exp(t.im))/r,.5*Math.cos(t.re)*(Math.exp(-t.im)-Math.exp(t.im))/r)},BigNumber:function(t){return a(t,e.BigNumber,1,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function csc is no angle\");return 1/Math.sin(t.value)},\"Array | Matrix\":function(e){return i(e,o)}});return o.toTex=\"\\\\csc\\\\left(${args[0]}\\\\right)\",o}var i=r(19),a=r(452);t.name=\"csc\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"csch\",{number:i,Complex:function(t){var r=Math.exp(t.re),n=Math.exp(-t.re),i=Math.cos(t.im)*(r-n),a=Math.sin(t.im)*(r+n),o=i*i+a*a;return new e.Complex(2*i/o,-2*a/o)},BigNumber:function(t){return o(t,e.BigNumber,!0,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function csch is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s)}});return s.toTex=\"\\\\mathrm{csch}\\\\left(${args[0]}\\\\right)\",s}function i(e){return 0==e?Number.POSITIVE_INFINITY:Math.abs(2/(Math.exp(e)-Math.exp(-e)))*s(e)}var a=r(19),o=r(473),s=r(6).sign;t.name=\"csch\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"sec\",{number:function(e){return 1/Math.cos(e)},Complex:function(t){var r=.25*(Math.exp(-2*t.im)+Math.exp(2*t.im))+.5*Math.cos(2*t.re);return new e.Complex(.5*Math.cos(t.re)*(Math.exp(-t.im)+Math.exp(t.im))/r,.5*Math.sin(t.re)*(Math.exp(t.im)-Math.exp(-t.im))/r)},BigNumber:function(t){return a(t,e.BigNumber,0,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function sec is no angle\");return 1/Math.cos(t.value)},\"Array | Matrix\":function(e){return i(e,o)}});return o.toTex=\"\\\\sec\\\\left(${args[0]}\\\\right)\",o}var i=r(19),a=r(452);t.name=\"sec\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"sech\",{number:i,Complex:function(t){var r=Math.exp(t.re),n=Math.exp(-t.re),i=Math.cos(t.im)*(r+n),a=Math.sin(t.im)*(r-n),o=i*i+a*a;return new e.Complex(2*i/o,-2*a/o)},BigNumber:function(t){return o(t,e.BigNumber,!1,!0)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function sech is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s)}});return s.toTex=\"\\\\mathrm{sech}\\\\left(${args[0]}\\\\right)\",s}function i(e){return 2/(Math.exp(e)+Math.exp(-e))}var a=r(19),o=r(473);t.name=\"sech\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,o){var s=o.find(n(r(472)),[\"number\"]),u=o.find(n(r(474)),[\"number\"]),c=o(\"sin\",{number:Math.sin,Complex:function(t){return new e.Complex(Math.sin(t.re)*s(-t.im),Math.cos(t.re)*u(t.im))},BigNumber:function(t){return a(t,e.BigNumber,1,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function sin is no angle\");return Math.sin(t.value)},\"Array | Matrix\":function(e){return i(e,c,!0)}});return c.toTex=\"\\\\sin\\\\left(${args[0]}\\\\right)\",c}var i=r(19),a=r(452);t.name=\"sin\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var o=n(\"tan\",{number:Math.tan,Complex:function(t){var r=Math.exp(-4*t.im)+2*Math.exp(-2*t.im)*Math.cos(2*t.re)+1;return new e.Complex(2*Math.exp(-2*t.im)*Math.sin(2*t.re)/r,(1-Math.exp(-4*t.im))/r)},BigNumber:function(t){return a(t,e.BigNumber,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function tan is no angle\");return Math.tan(t.value)},\"Array | Matrix\":function(e){return i(e,o,!0)}});return o.toTex=\"\\\\tan\\\\left(${args[0]}\\\\right)\",o}var i=r(19),a=r(476);t.name=\"tan\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var s=n(\"tanh\",{number:i,Complex:function(t){var r=Math.exp(2*t.re),n=r*Math.cos(2*t.im),i=r*Math.sin(2*t.im),a=(n+1)*(n+1)+i*i;return new e.Complex(((n-1)*(n+1)+i*i)/a,2*i/a)},BigNumber:function(t){\nreturn o(t,e.BigNumber,!1)},Unit:function(t){if(!t.hasBase(e.Unit.BASE_UNITS.ANGLE))throw new TypeError(\"Unit in function tanh is no angle\");return i(t.value)},\"Array | Matrix\":function(e){return a(e,s,!0)}});return s.toTex=\"\\\\tanh\\\\left(${args[0]}\\\\right)\",s}function i(e){var t=Math.exp(2*e);return(t-1)/(t+1)}var a=r(19),o=r(478);t.name=\"tanh\",t.factory=n},function(e,t,r){e.exports=[r(487)]},function(e,t,r){\"use strict\";function n(e,t,n,i){var a=r(30),o=n(r(51)),s=n(r(56)),u=n(r(57)),c=i(\"to\",{\"Unit, Unit | string\":function(e,t){return e.to(t)},\"Matrix, Matrix\":function(e,t){return s(e,t,c)},\"Array, Array\":function(e,t){return c(o(e),o(t)).valueOf()},\"Array, Matrix\":function(e,t){return c(o(e),t)},\"Matrix, Array\":function(e,t){return c(e,o(t))},\"Matrix, any\":function(e,t){return u(e,t,c,!1)},\"any, Matrix\":function(e,t){return u(t,e,c,!0)},\"Array, any\":function(e,t){return u(o(e),t,c,!1).valueOf()},\"any, Array\":function(e,t){return u(o(t),e,c,!0).valueOf()}});return c.toTex=\"\\\\left(${args[0]}\"+a.operators.to+\"${args[1]}\\\\right)\",c}t.name=\"to\",t.factory=n},function(e,t,r){e.exports=[r(489),r(281),r(490),r(396),r(395),r(424),r(358),r(491),r(286),r(439),r(492),r(493),r(494),r(283)]},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"clone\",{any:i.clone});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}var i=r(3);t.name=\"clone\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"format\",{any:i.format,\"any, Object | function | number\":i.format});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}var i=r(23);t.name=\"format\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"isZero\",{number:function(e){return 0===e},BigNumber:function(e){return e.isZero()},Complex:function(e){return 0===e.re&&0===e.im},Fraction:function(e){return 1===e.d&&0===e.n},Unit:function(e){return 0===e.value},\"Array | Matrix\":function(e){return i(e,a)}});return a}var i=r(19);r(6);t.name=\"isZero\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"print\",{\"string, Object\":i,\"string, Object, number\":i});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}function i(e,t,r){return e.replace(/\\$([\\w\\.]+)/g,function(e,n){for(var i=n.split(\".\"),s=t[i.shift()];i.length&&void 0!==s;){var u=i.shift();s=u?s[u]:s+\".\"}return void 0!==s?a(s)?s:o(s,r):e})}var a=r(23).isString,o=r(23).format;t.name=\"print\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,n,a){function o(e){if(\"asc\"===e)return f;if(\"desc\"===e)return l;throw new Error('String \"asc\" or \"desc\" expected')}function s(e){if(1!==i(e).length)throw new Error(\"One dimensional array expected\")}function u(e){if(1!==e.size().length)throw new Error(\"One dimensional matrix expected\")}var c=n(r(51)),f=n(r(432)),l=function(e,t){return-f(e,t)},p=a(\"sort\",{Array:function(e){return s(e),e.sort(f)},Matrix:function(e){return u(e),c(e.toArray().sort(f),e.storage())},\"Array, function\":function(e,t){return s(e),e.sort(t)},\"Matrix, function\":function(e,t){return u(e),c(e.toArray().sort(t),e.storage())},\"Array, string\":function(e,t){return s(e),e.sort(o(t))},\"Matrix, string\":function(e,t){return u(e),c(e.toArray().sort(o(t)),e.storage())}});return p.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",p}var i=r(40).size;t.name=\"sort\",t.factory=n},function(e,t,r){\"use strict\";function n(e,t,r,n){var a=n(\"_typeof\",{any:function(e){var t=i.type(e);if(\"Object\"===t){if(e.isBigNumber===!0)return\"BigNumber\";if(e.isComplex===!0)return\"Complex\";if(e.isFraction===!0)return\"Fraction\";if(e.isMatrix===!0)return\"Matrix\";if(e.isUnit===!0)return\"Unit\";if(e.isIndex===!0)return\"Index\";if(e.isRange===!0)return\"Range\";if(e.isChain===!0)return\"Chain\";if(e.isHelp===!0)return\"Help\"}return t}});return a.toTex=\"\\\\mathrm{${name}}\\\\left(${args}\\\\right)\",a}var i=r(41);t.name=\"typeof\",t.factory=n},function(e,t,r){e.exports=[r(496)]},function(e,t){\"use strict\";function r(e,t,r,n){return function(t,r){var n=e[r&&r.mathjs];return n&&\"function\"==typeof n.fromJSON?n.fromJSON(r):r}}t.name=\"reviver\",t.path=\"json\",t.factory=r},function(e,t,r){\"use strict\";var n=r(11),i=r(42),a=r(43);e.exports=[{name:\"ArgumentsError\",path:\"error\",factory:function(){return n}},{name:\"DimensionError\",path:\"error\",factory:function(){return i}},{name:\"IndexError\",path:\"error\",factory:function(){return a}}]}])});\n//# sourceMappingURL=math.map\n",
            "title": "$:/plugins/mklauber/math.js/math.js",
            "type": "application/javascript",
            "module-type": "library"
        }
    }
}
{
    "tiddlers": {
        "$:/config/DefaultColourMappings/menubar-foreground": {
            "title": "$:/config/DefaultColourMappings/menubar-foreground",
            "text": "#fff"
        },
        "$:/config/DefaultColourMappings/menubar-background": {
            "title": "$:/config/DefaultColourMappings/menubar-background",
            "text": "#5778d8"
        },
        "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols": {
            "title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols",
            "text": "hide"
        },
        "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server": {
            "title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server",
            "text": "hide"
        },
        "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar": {
            "title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar",
            "text": "hide"
        },
        "$:/config/plugins/menubar/TableOfContents/Tag": {
            "title": "$:/config/plugins/menubar/TableOfContents/Tag",
            "text": "TableOfContents"
        },
        "$:/config/plugins/menubar/breakpoint": {
            "title": "$:/config/plugins/menubar/breakpoint",
            "text": "620px"
        },
        "$:/plugins/tiddlywiki/menubar/config": {
            "title": "$:/plugins/tiddlywiki/menubar/config",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "Menu Bar",
            "text": "\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\n\n! Menu Bar Configuration\n\n!! Menu Items\n\nSelect which menu items will be shown. You can also drag items to reorder them.\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/MenuBar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n\n!! Breakpoint Position\n\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/breakpoint\" default=\"\" tag=\"input\"/>\n\n!! Contents Tag\n\nThe tag for the ~TableOfContents used in the Contents dropdown\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/TableOfContents/Tag\" default=\"\" tag=\"input\"/>\n\n!! Menu Bar Colours\n\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/contents": {
            "title": "$:/plugins/tiddlywiki/menubar/items/contents",
            "caption": "Contents",
            "description": "Table of Contents",
            "is-dropdown": "yes",
            "tags": "$:/tags/MenuBar",
            "text": "<div class=\"tc-table-of-contents\">\n\n<$macrocall $name=\"toc-selective-expandable\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\n\n</div>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/hamburger": {
            "title": "$:/plugins/tiddlywiki/menubar/items/hamburger",
            "tags": "$:/tags/MenuBar",
            "caption": "Hamburger",
            "description": "Show the full menu bar on a narrow screen",
            "custom-menu-content": "{{$:/plugins/tiddlywiki/menubar/items/hamburger}}",
            "show-when": "narrow",
            "text": "<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"yes\">\n{{$:/core/images/menu-button}}\n</$button>\n</$list>\n<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"no\">\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/pagecontrols": {
            "title": "$:/plugins/tiddlywiki/menubar/items/pagecontrols",
            "tags": "$:/tags/MenuBar",
            "description": "Page controls from the sidebar",
            "caption": "Page controls",
            "custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\" mode=\"inline\"/>",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/search": {
            "title": "$:/plugins/tiddlywiki/menubar/items/search",
            "custom-menu-content": "{{$:/plugins/tiddlywiki/menubar/items/search}}",
            "description": "Search",
            "caption": "Search",
            "tags": "$:/tags/MenuBar",
            "text": "\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<__storeTitle__>get[text]] }}}>\n<$list filter=\"[<__tiddler__>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]\"/>\"\"\">\n<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\whitespace trim\n<$vars searchTiddler=\"$:/temp/menubarsearch/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<span style=\"margin: 0 0.5em;\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/menubarsearch\" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> \n\t\trefreshTitle=\"$:/temp/menubarsearch/refresh\" tag=\"input\" type=\"search\" focusPopup=\"$:/state/popup/menubar-search-dropdown\" \n\t\tclass=\"tc-popup-handle tc-menu-show-when-wide\" placeholder=\"Search...\" default=\"\" cancelPopups=\"yes\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> inputCancelActions=<<cancel-search-actions>> \n\t\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n</span>\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/state/popup/menubar-search-dropdown\" type=\"nomatch\" text=\"\" default=\"\">\n\n<div  class=\"tc-block-dropdown tc-search-drop-down\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">Type your search terms</div>\"\"\" variable=\"ignore\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [<searchTiddler>get[text]] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$list>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n</$vars>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/server": {
            "title": "$:/plugins/tiddlywiki/menubar/items/server",
            "tags": "$:/tags/MenuBar",
            "description": "Server options",
            "caption": "Server",
            "custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/server\" mode=\"inline\"/>",
            "text": "<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\" variable=\"ignore\">\n<$transclude tiddler=\"$:/core/ui/Buttons/save-wiki\" mode=\"inline\"/>\n</$list>\n<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\" variable=\"ignore\">\n<$button message=\"tm-login\">\nLogin\n</$button>\n</$list>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/sidebar": {
            "title": "$:/plugins/tiddlywiki/menubar/items/sidebar",
            "caption": "Sidebar",
            "description": "Sidebar",
            "is-dropdown": "yes",
            "tags": "$:/tags/MenuBar",
            "text": "<$scrollable fallthrough=\"none\" class=\"tc-popup-keep tc-menubar-dropdown-sidebar\">\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\" mode=\"inline\"/>\n\n</$scrollable>\n"
        },
        "$:/plugins/tiddlywiki/menubar/items/topleftbar": {
            "title": "$:/plugins/tiddlywiki/menubar/items/topleftbar",
            "tags": "$:/tags/MenuBar",
            "description": "Items from $:/tags/TopLeftBar",
            "caption": "Legacy Top Left Bar",
            "custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/topleftbar\" mode=\"inline\"/>",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"
        },
        "$:/plugins/tiddlywiki/menubar/items/toprightbar": {
            "title": "$:/plugins/tiddlywiki/menubar/items/toprightbar",
            "tags": "$:/tags/MenuBar",
            "description": "Items from $:/tags/TopRightBar",
            "caption": "Legacy Top Right Bar",
            "custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/toprightbar\" mode=\"inline\"/>",
            "custom-menu-styles-wide": "float: right;",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"
        },
        "$:/plugins/tiddlywiki/menubar/menu": {
            "title": "$:/plugins/tiddlywiki/menubar/menu",
            "tags": "$:/tags/PageTemplate",
            "text": "\\define menubar-inner(size)\n<ul class=\"tc-menubar-list\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$list filter=\"[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\" variable=\"ignore\">\n<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\n<$list filter=\"[<currentTiddler>!is-dropdown[yes]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Dropdown -->\n\t<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n\t<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n\t<$button popup=<<dropdown-state>> selectedClass=\"tc-selected\">\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t<$text text=\" \"/>\n\t<span class=\"tc-menubar-dropdown-arrow\">\n\t<$transclude tiddler=\"$:/core/images/down-arrow\" mode=\"inline\"/>\n\t</span>\n\t</$set>\n\t</$button>\n\t</$set>\n\t</$set>\n\"\"\">\n<$list filter=\"[<currentTiddler>has[custom-menu-content]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Link -->\n\t<$link to={{!!target}}>\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t</$set>\n\t</$link>\n\"\"\">\n<!-- Custom content -->\n<$transclude field=\"custom-menu-content\" mode=\"inline\"/>\n</$list>\n</$list>\n</li>\n</$list>\n</$list>\n</$list>\n</ul>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\" variable=\"listItem\">\n<nav class=\"tc-menubar tc-adjust-top-of-scroll\">\n<div class=\"tc-menubar-narrow\">\n<<menubar-inner narrow>>\n</div>\n<div class=\"tc-menubar-wide\">\n<<menubar-inner wide>>\n</div>\n<div style=\"clear:both;\"/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n<$reveal type=\"popup\" state=<<dropdown-state>> class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag=\"div\">\n<div class=\"tc-drop-down\">\n<$transclude/>\n</div>\n</$reveal>\n</$set>\n</$set>\n</$list>\n</$list>\n</nav>\n</$list>\n"
        },
        "$:/core/ui/PageTemplate/topleftbar": {
            "title": "$:/core/ui/PageTemplate/topleftbar",
            "text": "<!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->"
        },
        "$:/core/ui/PageTemplate/toprightbar": {
            "title": "$:/core/ui/PageTemplate/toprightbar",
            "text": "<!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->"
        },
        "$:/plugins/tiddlywiki/menubar/readme": {
            "title": "$:/plugins/tiddlywiki/menubar/readme",
            "text": "!! Introduction\n\nThis plugin provides a menu bar with the following features:\n\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\n* Menu items can be individually enabled via the control panel\n* Responds to reduced screen width by abbreviating the menu items to a \"hamburger\" dropdown\n\n!! Menu Item Tiddlers\n\nMenu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by this plugin:\n\n|!Field Name |!Purpose |\n|title |Each menu item must have a unique title (not shown to the user) |\n|description |Description for use in listings |\n|tags |Must contain `$:/tags/MenuBar` |\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\n|target |For simple link menu items specifies a tiddler title as the target of the link |\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\n|text |For dropdown menu items, specifies the body of the dropdown |\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\n\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\n\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\n"
        },
        "$:/plugins/tiddlywiki/menubar/styles": {
            "title": "$:/plugins/tiddlywiki/menubar/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define breakpoint-plus-one()\n<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\n\\end\n\n\\define set-sidebar-scrollable-top-if-hamburger()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n\\end\n\n\\define set-sidebar-scrollable-top()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\">\n\n\t.tc-sidebar-scrollable {\n\t\tmargin-top: 2em;\n\t}\n\n</$list>\n<$reveal state=\"$:/state/popup/menubar/hamburger\" type=\"match\" text=\"yes\">\n\n\t<$set name=\"itemCount\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\n\n\t\t.tc-sidebar-scrollable {\n\t\t\tmargin-top: calc(<<itemCount>> * 2em);\n\t\t}\n\n\t</$set>\n\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\nnav.tc-menubar {\n\tposition: fixed;\n\tz-index: 850;\n\tdisplay: inline-block;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\nnav.tc-menubar ul.tc-menubar-list {\n\tposition: relative;\n\tlist-style-type: none;\n\tmargin: 0;\n\tpadding: 0 0 0 42px;\n\tbackground: <<colour background>>;\n\tbackground: <<colour menubar-background>>;\n\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\thtml nav.tc-menubar ul.tc-menubar-list {\n\t\tpadding: 0 0 0 8px;\n\t}\n\n}\n\nnav.tc-menubar li.tc-menubar-item {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\n\tdisplay: block;\n}\n\nnav.tc-menubar li.tc-menubar-item > a,\nnav.tc-menubar li.tc-menubar-item > button {\n\tdisplay: inline-block;\n/*\ttext-transform: uppercase; */\n\tline-height: 1;\n\tfont-weight: 700;\n\tcolor: <<colour foreground>>;\n\tcolor: <<colour menubar-foreground>>;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n\ttext-decoration: none;\n\tpadding: 0.5em;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item svg {\n\ttransition: none;\n\twidth: 1em;\n\theight: 1em;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n}\n\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:hover,\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\nnav.tc-menubar li.tc-menubar-item > button:hover {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:active,\nnav.tc-menubar li.tc-menubar-item > button:active svg,\nnav.tc-menubar li.tc-menubar-item > button:active {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down,\nnav.tc-menubar .tc-block-dropdown {\n\tmax-width: 70vw;\n\tmax-height: 70vh;\n\toverflow: auto;\n}\n\nnav.tc-menubar .tc-drop-down a {\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\n\tdisplay: inline-block;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-drop-down ol {\n\tmargin: 0;\n}\n\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\n\tdisplay: inline;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t.tc-menubar-wide {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (min-width: <<breakpoint-plus-one>>) {\n\n\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\n\t.tc-menubar-narrow {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t<<set-sidebar-scrollable-top-if-hamburger>>\n\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t<<set-sidebar-scrollable-top>>\n\n}\n@media print {\n\n\tnav.tc-menubar {\n\t\tdisplay: none;\n\t}\n\n}\n"
        },
        "$:/tags/MenuBar": {
            "title": "$:/tags/MenuBar",
            "list": "$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar"
        }
    }
}
a non-linear personal web wiki for dungeons and dragons
D&D Wiki
$:/core/ui/AdvancedSearch/Filter
close
close
close
close
close
close
close
close
close
open
readme
no
no
config
yes
no
close
$:/core/ui/AdvancedSearch/Filter
Tiny Animated Objects
$:/core/ui/ControlPanel/Plugins
$:/core/ui/ControlPanel/Saving/GitHub
$:/core/ui/TiddlerInfo/Advanced
$:/core/ui/SideBar/Tools
Class
Class
Class
Class
Hardcover
Perfect Self
Weather
Weather
Sight
Unarmed Strike
1st Level Bard Spells
Adventure
Feat
Feat
Arctic Circle Spells
Combat Actions
Combat Actions
Surprised
MarksConfig
Cackle Fever
Damage Severity Table
Trap
Character Creation
Equipment
Average Class Hitpoints Table
DM Reference
Item
Burgler's Pack
Armor
Item
Item
Movement Type
Movement Type
Movement Rules
Movement Rules
Homebrew Adventure
Homebrew Item
External Image
Internal Image
Internal Image
Spell Scroll
Magic Item
Magic Item
Magic Item List
Magic Item List
$:/plugins/benwebber/dnd/dnd.js
Monk Ki
Basic Macros
Long-Term Madness
Aberration
Aberration
Aberration
Aberration
Aberration
Travel Pace
README
Character
Character
Contact Poison
Injury Poison
Assassin's Blood
Crawler Mucus
Crawler Mucus
Assassin's Blood
Assassin's Blood
Burnt Othur Fumes
Burnt Othur Fumes
Drow Poison
Drow Poison
Sourcebook
Adventure
Charm
Charm
Environment
CombatRule
CombatRule
Exploration
Movement
Surprised
Surprised
Light Source
Underwater
Travel Pace
Difficult Terrain
Underwater
Sample High Elf Wizard Cantrip
Sample High Elf Wizard 1st
Sample High Elf Wizard Skill
Sample High Elf Wizard Statistic
Sample Spellbook Cantrip
Sample Spellbook Cantrip
Sorcerer Cantrips
Sample Spellbook
Sample Spellbook
Sorcerer Spells
Cantrip
SRD Spell
SRD Spell Cantrip
D&D Stylesheet
TestMark
Stylesheet
Alchemist's Supplies
Collapsing Roof
Collapsing Roof
Winter's Splendor - The Midwinter Market
Winter's Splendor - The Midwinter Market
Winter's Splendor - More Questions Than Answers
Winter's Splendor - Lockdown in the Villa
Winter's Splendor - Background
Winter's Splendor - The Wooden Girl
close
open
open
close
close
open
open
close
open
close
close
close
open
open
open
close
close
close
close
close
close
no

{
    "tiddlers": {
        "$:/themes/tiddlywiki/snowwhite/base": {
            "title": "$:/themes/tiddlywiki/snowwhite/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/vanilla/themetweaks": {
            "title": "$:/themes/tiddlywiki/vanilla/themetweaks",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
        },
        "$:/themes/tiddlywiki/vanilla/base": {
            "title": "$:/themes/tiddlywiki/vanilla/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n        background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n    border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    left: -50px;\n    top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    right: -80px;\n    bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n  font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition:  min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n  font-style: italic;\n  font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n    height: 1.2em;\n    width: 1.2em;\n    margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg  {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n  fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n  fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n  fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n  fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n  fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n  fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n  fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n  fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n  fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg  {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n    width: auto;\n    margin-bottom: 0px;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical  {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical  {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical  {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n    display: block;\n    width: 100%;\n    text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n    flex: 1 0;\n    background: <<colour tiddler-editor-background>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n    white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n    background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n    padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n    flex: 3 1;\n    border-left: 0.5em solid <<colour muted-foreground>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n    line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n    font-size: 0.8em;\n    margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n    align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n    margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n    padding: 2px 7px;\n    font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n    margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n    text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n    margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n    vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n    margin: 0;\n    padding: 0;\n    border: none;\n    background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n    \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n    \tlist-style-type: none;\n    \tpadding-left: 0;\n    \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n    \tpadding-left: 1em;    \n}\n\n.tc-tree button { \n    \tcolor: #acacac;\n}\n\n.tc-tree svg {\n     \tfill: #acacac;\n}\n\n.tc-tree span svg {\n    \twidth: 1em;\n    \theight: 1em;\n    \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n    \tcolor: lightgray;\n}\n\nselect {\n        color: <<colour select-tag-foreground>>;\n        background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
            "text": "15px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
            "text": "22px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
            "text": "14px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
            "text": "20px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storytop": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyright": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
            "text": "686px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
            "text": "960px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
            "text": "350px"
        },
        "$:/themes/tiddlywiki/vanilla/options/stickytitles": {
            "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
            "text": "no"
        },
        "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
            "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
            "text": "fixed-fluid"
        },
        "$:/themes/tiddlywiki/vanilla/options/codewrapping": {
            "title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
            "text": "pre-wrap"
        },
        "$:/themes/tiddlywiki/vanilla/reset": {
            "title": "$:/themes/tiddlywiki/vanilla/reset",
            "type": "text/plain",
            "text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n  -moz-tab-size: 4;\n  tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n  margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n  font-family:\n    system-ui,\n    -apple-system, /* Firefox supports this but not yet `system-ui` */\n    'Segoe UI',\n    Roboto,\n    Helvetica,\n    Arial,\n    sans-serif,\n    'Apple Color Emoji',\n    'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n  height: 0; /* 1 */\n  color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n  text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    Consolas,\n    'Liberation Mono',\n    Menlo,\n    monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n  text-indent: 0; /* 1 */\n  border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n  -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n  padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
            "text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""
        },
        "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
            "text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
            "text": "fixed"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
            "text": "auto"
        },
        "$:/themes/tiddlywiki/vanilla/sticky": {
            "title": "$:/themes/tiddlywiki/vanilla/sticky",
            "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
        }
    }
}
<<spelltable "[[Animal Friendship]] [[Bane]] [[Charm Person]] [[Color Spray]] [[Command]] [[Comprehend Languages]] [[Cure Wounds]] [[Detect Magic]] [[Disguise Self]] [[Dissonant Whispers]] [[Earth Tremor]] [[Faerie Fire]] [[Feather Fall]] [[Healing Word]] [[Heroism]] [[Identify]] [[Illusory Script]] 
[[Longstrider]] [[Silent Image]] [[Sleep]] [[Speak with Animals]] [[Tasha's Hideous Laughter]] [[Thunderwave]] [[Unseen Servant]]">>
<<spelltable "[[Bane]] [[Bless]] [[Ceremony]] [[Command]] [[Create or Destroy Water]] [[Cure Wounds]] [[Detect Evil and Good]] [[Detect Magic]] [[Detect Poison and Disease]] [[Protection from Evil and Good]] [[Purify Food and Drink]] [[Sanctuary]] [[Shield of Faith]]">>
<<spelltable "[[Absorb Elements]] [[Animal Friendship]] [[Beast Bond]] [[Charm Person]] [[Create or Destroy Water]] [[Cure Wounds]] [[Detect Magic]] [[Detect Poison and Disease]] [[Earth Tremor]] [[Entangle]] [[Faerie Fire]] [[Fog Cloud]] [[Goodberry]] [[Healing Word]] [[Ice Knife]] [[Jump]] [[Longstrider]] [[Protection from Evil and Good]]  [[Purify Food and Drink]] [[Snare]] [[Speak with Animals]] [[Thunderwave]]">>
<<spelltable "[[Bless]] [[Ceremony]] [[Command]] [[Compelled Duel]] [[Cure Wounds]] [[Detect Evil and Good]] [[Detect Magic]] [[Detect Poison and Disease]] [[Divine Favor]] [[Heroism]] [[Protection from Evil and Good]] [[Purify Food and Drink]] [[Searing Smite]] [[Shield of Faith]] [[Thunderous Smite]] [[Wrathful Smite]]">>


<<spelltable "[[Absorb Elements]] [[Alarm]] [[Animal Friendship]] [[Beast Bond]] [[Cure Wounds]] [[Detect Magic]] [[Detect Poison and Disease]] [[Ensnaring Strike]] [[Entangle]] [[Fog Cloud]] [[Goodberry]] [[Hail of Thorns]] [[Hunter's Mark]] [[Jump]] [[Longstrider]] [[Searing Smite]] [[Snare]] [[Speak with Animals]] [[Zephyr Strike]]">>
<<spelltable "[[Absorb Elements]] [[Burning Hands]] [[Catapult]] [[Chaos Bolt]] [[Charm Person]] [[Chromatic Orb]] [[Color Spray]] [[Comprehend Languages]] [[Detect Magic]] [[Disguise Self]] [[Earth Tremor]] [[Expeditious Retreat]] [[False Life]] [[Feather Fall]] [[Fog Cloud]] [[Grease]] [[Ice Knife]] [[Jump]] [[Mage Armor]] [[Magic Missile]] [[Ray of Sickness]] [[Shield]] [[Silent Image]] [[Sleep]] [[Tasha's Caustic Brew]] [[Thunderwave]] [[Witch Bolt]] ">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[1]sort[]]">>
<<spelltable "[[Armor of Agathys]] [[Arms of Hadar]] [[Cause Fear]] [[Charm Person]] [[Comprehend Languages]] [[Expeditious Retreat]] [[Hellish Rebuke]] [[Hex]] [[Illusory Script]] [[Protection from Evil and Good]] [[Unseen Servant]] [[Witch Bolt]]">>
<<spelltable "[[Absorb Elements]] [[Alarm]] [[Burning Hands]] [[Catapult]] [[Cause Fear]] [[Charm Person]] [[Chromatic Orb]] [[Color Spray]] [[Comprehend Languages]] [[Detect Magic]] [[Disguise Self]] [[Earth Tremor]] [[Expeditious Retreat]] [[False Life]] [[Feather Fall]][[Find Familiar]] [[Fog Cloud]] [[Grease]] [[Hideous Laughter]] [[Ice Knife]] [[Identify]] [[Illusory Script]] [[Jump]] [[Longstrider]] [[Mage Armor]] [[Magic Missile]] [[Protection from Evil and Good]] [[Ray of Sickness]] [[Shield]] [[Silent Image]] [[Sleep]] [[Snare]] [[Tasha's Caustic Brew]] [[Tenser's Floating Disk]] [[Thunderwave]] [[Unseen Servant]] [[Witch Bolt]]">>
<<spelltable "[[Animal Messenger]] [[Aid]] [[Blindness/Deafness]] [[Calm Emotions]] [[Cloud of Daggers]] [[Crown of Madness]] [[Detect Thoughts]] [[Enhance Ability]] [[Enlarge/Reduce]] [[Enthrall]] [[Heat Metal]] [[Hold Person]] [[Invisibility]] [[Knock]] [[Lesser Restoration]] [[Locate Animals or Plants]] [[Locate Object]] [[Magic Mouth]] [[Mirror Image]] [[Phantasmal Force]] [[Pyrotechnics]] [[See Invisibility]] [[Shatter]] [[Silence]] [[Skywrite]] [[Suggestion]] [[Warding Wind]] [[Zone of Truth]]">>
<<spelltable "[[Aid]] [[Augury]] [[Blindness/Deafness]] [[Calm Emotions]] [[Continual Flame]] [[Enhance Ability]] [[Find Traps]] [[Gentle Repose]] [[Hold Person]] [[Lesser Restoration]] [[Locate Object]] [[Prayer of Healing]] [[Protection from Poison]] [[Silence]] [[Spiritual Weapon]] [[Warding Bond]] [[Zone of Truth]]">>
<<spelltable "[[Animal Messenger]] [[Augury]] [[Barkskin]] [[Beast Sense]] [[Continual Flame]] [[Darkvision]] [[Dust Devil]] [[Earthbind]] [[Enhance Ability]] [[Enlarge/Reduce]] [[Find Traps]] [[Flame Blade]] [[Flaming Sphere]] [[Gust of Wind]] [[Healing Spirit]] [[Heat Metal]] [[Hold Person]] [[Lesser Restoration]] [[Locate Animals or Plants]] [[Locate Object]] [[Moonbeam]] [[Pass Without Trace]] [[Protection from Poison]] [[Skywrite]] [[Spike Growth]] [[Summon Beast]] [[Warding Wind]]">>

<<spelltable "[[Aid]] [[Branding Smite]] [[Find Steed]] [[Gentle Repose]] [[Lesser Restoration]] [[Locate Object]] [[Magic Weapon]] [[Prayer of Healing]] [[Protection from Poison]] [[Warding Bond]] [[Zone of Truth]]">>
<<spelltable "[[Aid]] [[Animal Messenger]] [[Barkskin]] [[Beast Sense]] [[Cordon of Arrows]] [[Darkvision]] [[Enhance Ability]] [[Find Traps]] [[Gust of Wind]] [[Healing Spirit]] [[Lesser Restoration]] [[Locate Animals or Plants]] [[Locate Object]] [[Magic Weapon]] [[Pass without Trace]] [[Protection from Poison]] [[Silence]] [[Spike Growth]] [[Summon Beast]]">>
<<spelltable "[[Aganazzar's Scorcher]] [[Alter Self]] [[Blindness/Deafness]] [[Blur]] [[Cloud of Daggers]] [[Crown of Madness]] [[Darkness]] [[Darkvision]] [[Detect Thoughts]] [[Dragon's Breath]] [[Dust Devil]] [[Earthbind]] [[Enhance Ability]] [[Enlarge/Reduce]] [[Flame Blade]] [[Flaming Sphere]] [[Gust of Wind]] [[Hold Person]] [[Invisibility]] [[Knock]] [[Levitate]] [[Maximilian’s Earthen Grasp]] [[Magic Weapon]] [[Mind Spike]] [[Mirror Image]] [[Misty Step]] [[Phantasmal Force]] [[Pyrotechnics]] [[Scorching Ray]] [[See Invisibility]] [[Shadow Blade]] [[Shatter]] [[Snilloc’s Snowball Swarm]] [[Spider Climb]] [[Suggestion]] [[Tasha's Mind Whip]] [[Warding Wind]] [[Web]] ">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[2]sort[]]">>
<<spelltable "[[Cloud of Daggers]] [[Crown of Madness]] [[Darkness]] [[Earthbind]] [[Enthrall]] [[Hold Person]] [[Invisibility]] [[Mind Spike]] [[Mirror Image]] [[Misty Step]] [[Ray of Enfeeblement]] [[Shadow Blade]] [[Shatter]] [[Spider Climb]] [[Suggestion]]">>
<<spelltable "[[Acid Arrow]] [[Aganazzar’s Scorcher]] [[Alter Self]] [[Arcane Lock]] [[Arcanist's Magic Aura]] [[Augury]] [[Blindness/Deafness]] [[Blur]] [[Cloud of Daggers]] [[Continual Flame]] [[Crown of Madness]] [[Darkness]] [[Darkvision]] [[Detect Thoughts]] [[Dragon's Breath]] [[Dust Devil]] [[Earthbind]] [[Enhance Ability]] [[Enlarge/Reduce]] [[Flaming Sphere]] [[Gentle Repose]] [[Gust of Wind]] [[Hold Person]] [[Invisibility]] [[Knock]] [[Levitate]] [[Locate Object]] [[Magic Mouth]] [[Magic Weapon]] [[Melf’s Acid Arrow]] [[Mind Spike]] [[Mirror Image]] [[Misty Step]] [[Nystul’s Magic Aura]] [[Phantasmal Force]] [[Pyrotechnics]] [[Ray of Enfeeblement]] [[Rope Trick]] [[Scorching Ray]] [[See Invisibility]] [[Shadow Blade]] [[Shatter]] [[Snilloc’s Snowball Swarm]] [[Spider Climb]] [[Suggestion]] [[Tasha's Mind Whip]] [[Warding Wind]] [[Web]]">>
<<spelltable "[[Bestow Curse]] [[Catnap]] [[Clairvoyance]] [[Dispel Magic]] [[Enemies Abound]] [[Fear]] [[Feign Death]] [[Glyph of Warding]] [[Hypnotic Pattern]] [[Intellect Fortress]] [[Leomund's Tiny Hut]] [[Major Image]] [[Mass Healing Word]] [[Nondetection]] [[Plant Growth]] [[Sending]] [[Slow]] [[Speak with Dead]] [[Speak with Plants]] [[Stinking Cloud]] [[Tongues]]">>
<<spelltable "[[Animate Dead]] [[Aura of Vitality]] [[Beacon of Hope]] [[Bestow Curse]] [[Clairvoyance]] [[Create Food and Water]] [[Daylight]] [[Dispel Magic]] [[Feign Death]] [[Gylph of Warding]] [[Life Transference]] [[Magic Circle]] [[Mass Healing Word]] [[Meld into Stone]] [[Protection from Energy]] [[Remove Curse]] [[Revivify]] [[Sending]] [[Speak with Dead]] [[Spirit Guardians]] [[Spirit Shroud]] [[Tongues]] [[Water Walk]]">>
<<spelltable "[[Aura of Vitality]] [[Call Lightning]] [[Conjure Animals]] [[Daylight]] [[Dispel Magic]] [[Elemental Weapon]] [[Erupting Earth]] [[Feign Death]] [[Flame Arrows]] [[Meld into Stone]] [[Plant Growth]] [[Protection from Energy]] [[Revivify]] [[Sleet Storm]] [[Speak with Plants]] [[Summon Fey]] [[Tidal Wave]] [[Wall of Water]] [[Water Breathing]] [[Water Walk]] [[Wind Wall]]">>

<<spelltable "[[Aura of Vitality]] [[Blinding Smite]] [[Create Food and Water]] [[Crusader’s Mantle]] [[Daylight]] [[Dispel Magic]] [[Elemental Weapon]] [[Magic Circle]] [[Remove Curse]] [[Revivify]] [[Spirit Shroud]]">>
<<spelltable "[[Conjure Animals]] [[Conjure Barrage]] [[Daylight]] [[Elemental Weapon]] [[Flame Arrows]] [[Lightning Arrow]] [[Meld into Stone]] [[Nondetection]] [[Plant Growth]] [[Protection from Energy]] [[Revivify]] [[Speak with Plants]] [[Summon Fey]] [[Water Breathing]] [[Water Walk]] [[Wind Wall]]">>
<<spelltable "[[Blink]] [[Catnap]] [[Clairvoyance]] [[Counterspell]] [[Daylight]] [[Dispel Magic]] [[Enemies Abound]] [[Erupting Earth]] [[Fear]] [[Fireball]] [[Flame Arrows]] [[Fly]] [[Gaseous Form]] [[Haste]] [[Hypnotic Pattern]] [[Intellect Fortress]] [[Lightning Bolt]] [[Major Image]] [[Melf's Minute Meteors]] [[Protection from Energy]] [[Sleet Storm]] [[Slow]] [[Stinking Cloud]] [[Thunder Step]] [[Tidal Wave]] [[Tongues]] [[Vampiric Touch]] [[Wall of Water]] [[Water Breathing]] [[Water Walk]] ">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[3]sort[]]">>
<<spelltable "[[Counterspell]] [[Dispel Magic]] [[Enemies Abound]] [[Fear]] [[Fly]] [[Gaseous Form]] [[Hunger of Hadar]] [[Hypnotic Pattern]] [[Intellect Fortress]] [[Magic Circle]] [[Major Image]] [[Remove Curse]] [[Spirit Shroud]] [[Summon Fey]] [[Summon Lesser Demon]] [[Summon Shadowspawn]] [[Summon Undead]] [[Thunder Step]] [[Tongues]] [[Vampiric Touch]]">>
<<spelltable "[[Animate Dead]] [[Bestow Curse]] [[Blink]] [[Catnap]] [[Clairvoyance]] [[Counterspell]] [[Dispel Magic]] [[Enemies Abound]] [[Erupting Earth]] [[Fear]] [[Feign Death]] [[Fireball]] [[Flame Arrows]] [[Fly]] [[Gaseous Form]] [[Glyph of Warding]] [[Haste]] [[Hypnotic Pattern]] [[Intellect Fortress]] [[Leomund's Tiny Hut]] [[Life Transference]] [[Lightning Bolt]] [[Magic Circle]] [[Major Image]] [[Melf's Minute Meteors]] [[Nondetection]] [[Phantom Steed]] [[Protection from Energy]] [[Remove Curse]] [[Sending]] [[Sleet Storm]] [[Slow]] [[Speak with Dead]] [[Spirit Shroud]] [[Stinking Cloud]] [[Summon Fey]] [[Summon Lesser Demon]] [[Summon Shadowspawn]] [[Summon Undead]] [[Thunder Step]] [[Tidal Wave]] [[Tiny Servant]] [[Tongues]] [[Vampiric Touch]] [[Wall of Sand]] [[Wall of Water]] [[Water Breathing]]">>
<<spelltable "[[Charm Monster]] [[Compulsion]] [[Confusion]] [[Dimension Door]] [[Freedom of Movement]] [[Greater Invisibility]] [[Hallucinatory Terrain]] [[Locate Creature]] [[Phantasmal Killer]] [[Polymorph]]">>
<<spelltable "[[Aura of Life]] [[Aura of Purity]] [[Banishment]] [[Control Water]] [[Death Ward]] [[Divination]] [[Freedom of Movement]] [[Guardian of Faith]] [[Locate Creature]] [[Stone Shape]]">>
<<spelltable "[[Blight]] [[Charm Monster]] [[Confusion]] [[Conjure Minor Elementals]] [[Conjure Woodland Beings]] [[Control Water]] [[Divination]] [[Dominate Beast]] [[Elemental Bane]] [[Fire Shield]] [[Freedom of Movement]] [[Giant Insect]] [[Grasping Vine]] [[Guardian of Nature]] [[Hallucinatory Terrain]] [[Ice Storm]] [[Locate Creature]] [[Polymorph]] [[Stone Shape]] [[Stoneskin]] [[Summon Elemental]] [[Wall of Fire]] [[Watery Sphere]]">>
<<spelltable "[[Aura of Life]] [[Aura of Purity]] [[Banishment]] [[Death Ward]] [[Find Greater Steed]] [[Locate Creature]] [[Staggering Smite]]">>
<<spelltable "[[Conjure Woodland Beings]] [[Dominate Beast]] [[Freedom of Movement]] [[Grasping Vine]] [[Guardian of Nature]] [[Locate Creature]] [[Stoneskin]] [[Summon Elemental]]">>
<<spelltable "[[Banishment]] [[Blight]] [[Charm Monster]] [[Confusion]] [[Dimension Door]] [[Dominate Beast]] [[Fire Shield]] [[Greater Invisibility]] [[Ice Storm]] [[Polymorph]] [[Sickening Radiance]] [[Stoneskin]] [[Storm Sphere]] [[Vitriolic Sphere]] [[Wall of Fire]] [[Watery Sphere]] ">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[4]sort[]]">>
<<spelltable "[[Banishment]] [[Blight]] [[Charm Monster]] [[Dimension Door]] [[Elemental Bane]] [[Hallucinatory Terrain]] [[Shadow of Moil]] [[Sickening Radiance]] [[Summon Abberation]] [[Summon Greater Demon]]">>
<<spelltable "[[Arcane Eye]] [[Banishment]] [[Black Tentacles]] [[Blight]] [[Charm Monster]] [[Confusion]] [[Conjure Minor Elementals]] [[Control Water]] [[Dimension Door]] [[Divination]] [[Elemental Bane]] [[Evard’s Black Tentacles]] [[Fabricate]] [[Faithful Hound]] [[Fire Shield]] [[Greater Invisibility]] [[Hallucinatory Terrain]] [[Ice Storm]] [[Leomund’s Secret Chest]] [[Locate Creature]] [[Mordenkainen’s Faithful Hound]] [[Mordenkainen’s Private Sanctum]] [[Otiluke’s Resilient Sphere]] [[Phantasmal Killer]] [[Polymorph]] [[Private Sanctum]] [[Resilient Sphere]] [[Secret Chest]] [[Sickening Radiance]] [[Stone Shape]] [[Stoneskin]] [[Storm Sphere]] [[Summon Aberation]] [[Summon Construct]] [[Summon Elemental]] [[Summon Greater Demon]] [[Vitriolic Sphere]] [[Wall of Fire]] [[Watery Sphere]]
">>
<<spelltable "[[Animate Objects]] [[Awaken]] [[Dominate Person]] [[Dream]] [[Geas]] [[Greater Restoration]] 
[[Hold Monster]] [[Legend Lore]] [[Mass Cure Wounds]] [[Mislead]] [[Modify Memory]] [[Planar Binding]] [[Raise Dead]] [[Rary's Telepathic Bond]] [[Scrying]] [[Seeming]] [[Skill Empowerment]] [[Synaptic Static]] [[Teleportation Circle]]">>
<<spelltable "[[Commune]] [[Contagion]] [[Dawn]] [[Dispel Evil and Good]] [[Flame Strike]] [[Geas]] [[Greater Restoration]] [[Hallow]] [[Holy Weapon]] [[Insect Plague]] [[Legend Lore]] [[Mass Cure Wounds]] [[Planar Binding]] [[Raise Dead]] [[Scrying]] [[Summon Celestial]]">>
<<spelltable "[[Antilife Shell]] [[Awaken]] [[Commune with Nature]] [[Cone of Cold]] [[Conjure Elemental]] [[Contagion]] [[Control Winds]] [[Geas]] [[Greater Restoration]] [[Insect Plague]] [[Maelstrom]] [[Mass Cure Wounds]] [[Planar Binding]] [[Reincarnate]] [[Scrying]] [[Transmute Rock]] [[Tree Stride]] [[Wall of Stone]] [[Wrath of Nature]]">>

<<spelltable "[[Banishing Smite]] [[Circle of Power]] [[Destructive Wave]] [[Dispel Evil and Good]] [[Geas]] [[Holy Weapon]] [[Raise Dead]] [[Summon Celestial]]">>
<<spelltable "[[Commune with Nature]] [[Conjure Volley]] [[Greater Restoration]] [[Steel Wind Strike]] [[Swift Quiver]] [[Tree Stride]] [[Wrath of Nature]]">>
<<spelltable "[[Animate Objects]] [[Bigby's Hand]] [[Cloudkill]] [[Cone of Cold]] [[Control Winds]] [[Creation]] [[Dominate Person]] [[Enervation]] [[Far Step]] [[Hold Monster]] [[Immolation]] [[Insect Plague]] [[Seeming]] [[Skill Empowerment]] [[Synaptic Static]] [[Telekinesis]] [[Teleportation Circle]] [[Wall of Light]] [[Wall of Stone]] ">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[5]sort[]]">>
<<spelltable "[[Contact Other Plane]] [[Danse Macabre]] [[Dream]] [[Enervation]] [[Far Step]] [[Hold Monster]] [[Infernal Calling]] [[Mislead]] [[Negative Energy Flood]] [[Planar Binding]] [[Scrying]] [[Synaptic Static]] [[Teleportation Circle]] [[Wall of Light]]">>
<<spelltable "[[Animate Objects]] [[Arcane Hand]] [[Bigby's Hand]] [[Cloudkill]] [[Cone of Cold]] [[Conjure Elemental]] [[Contact Other Plane]] [[Control Winds]] [[Creation]] [[Danse Macabre]] [[Dawn]] [[Dominate Person]] [[Dream]] [[Enervation]] [[Far Step]] [[Geas]] [[Hold Monster]] [[Immolation]] [[Infernal Calling]] [[Legend Lore]] [[Mislead]] [[Modify Memory]] [[Negative Energy Flood]] [[Passwall]] [[Planar Binding]] [[Rary's Telepathic Bond]] [[Scrying]] [[Seeming]] [[Skill Empowerment]] [[Steel Wind Strike]] [[Summon Fiend]] [[Synaptic Static]] [[Tasha's Otherworldly Gaze]] [[Telekinesis]] [[Telepathic Bond]] [[Teleportation Circle]] [[Transmute Rock]] [[Wall of Force]] [[Wall of Light]] [[Wall of Stone]] ">>
<<spelltable "[[Eyebite]] [[Find the Path]] [[Guards and Wards]] [[Heroes' Feast]] [[Mass Suggestion]] [[Otto's Irresistible Dance]] [[Programmed Illusion]] [[True Seeing]]">>
<<spelltable "[[Blade Barrier]] [[Create Undead]] [[Find the Path]] [[Forbiddance]] [[Harm]] [[Heal]] [[Heroes' Feast]] [[Planar Ally]] [[Sunbeam]] [[True Seeing]] [[Word of Recall]]">>
<<spelltable "[[Bones of the Earth]] [[Conjure Fey]] [[Druid Grove]] [[Find the Path]] [[Flesh to Stone]] [[Heal]] [[Heroes' Feast]] [[Investiture of Flame]] [[Investiture of Ice]] [[Investiture of Stone]] [[Investiture of Wind]] [[Move Earth]] [[Primordial Ward]] [[Sunbeam]] [[Transport via Plants]] [[Wall of Thorns]] [[Wind Walk]]">>
<<spelltable "[[Arcane Gate]] [[Chain Lightning]] [[Circle of Death]] [[Disintegrate]] [[Eyebite]] [[Flesh to Stone]] [[Globe of Invulnerability]] [[Investiture of Flame]] [[Investiture of Ice]] [[Investiture of Stone]] [[Investiture of Wind]] [[Mass Suggestion]] [[Mental Prison]] [[Move Earth]] [[Otiluke's Resilient Sphere]] [[Scatter]] [[Sunbeam]] [[Tasha's Otherworldly Guise]] [[True Seeing]]">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[6]sort[]]">>
<<spelltable "[[Arcane Gate]] [[Circle of Death]] [[Conjure Fey]] [[Create Undead]] [[Eyebite]] [[Flesh to Stone]] [[Investiture of Flame]] [[Investiture of Ice]] [[Investiture of Stone]] [[Investiture of Wind]] [[Mass Suggestion]] [[Mental Prison]] [[Scatter]] [[Soul Cage]] [[Summon Fiend]] [[Tasha's Otherworldly Gaze]] [[True Seeing]]">>
<<spelltable "[[Arcane Gate]] [[Chain Lightning]] [[Circle of Death]] [[Contingency]] [[Create Homunculus]] [[Create Undead]] [[Disintegrate]] [[Drawmij's Instant Summons]] [[Eyebite]] [[Flesh to Stone]] [[Freezing Sphere]] [[Globe of Invulnerability]] [[Guards and Wards]] [[Instant Summons]] [[Investiture of Flame]] [[Investiture of Ice]] [[Investiture of Stone]] [[Investiture of Wind]] [[Magic Jar]] [[Mass Suggestion]] [[Mental Prison]] [[Move Earth]] [[Otiluke's Freezing Sphere]] [[Otto's Irresistible Dance]] [[Programmed Illusion]] [[Scatter]] [[Soul Cage]] [[Sunbeam]] [[Tenser’s Transformation]] [[True Seeing]] [[Wall of Ice]] ">>
<<spelltable "[[Dream of the Blue Veil]] [[Etherealness]] [[Forcecage]] [[Mirage Arcane]] [[Mordenkainen's Sword]] [[Mordenkainen's Magnificent Mansion]] [[Prismatic Spray]] [[Project Image]] [[Regenerate]] [[Resurrection]] [[Symbol]] [[Teleport]]">>
<<spelltable "[[Conjure Celestial]] [[Divine Word]] [[Etherealness]] [[Fire Storm]] [[Plane Shift]] [[Regenerate]] [[Resurrection]] [[Symbol]] [[Temple of the Gods]]">>
<<spelltable "[[Fire Storm]] [[Mirage Arcane]] [[Plane Shift]] [[Regenerate]] [[Reverse Gravity]] [[Symbol]] [[Whirlwind]]">>

<<spelltable "[[Crown of Stars]] [[Delayed Blast Fireball]] [[Dream of the Blue Veil ]] [[Etherealness]] [[Finger of Death]] [[Fire Storm]] [[Plane Shift]] [[Power Word Pain]] [[Prismatic Spray]] [[Reverse Gravity]] [[Teleport]] [[Whirlwind]]">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[7]sort[]]">>
<<spelltable "[[Crown of Stars]] [[Dream of the Blue Veil]] [[Etherealness]] [[Finger of Death]] [[Forcecage]] [[Plane Shift]] [[Power Word Pain]]">>
<<spelltable "[[Crown of Stars]] [[Delayed Blast Fireball]] [[Dream of the Blue Veil]] [[Etherealness]] [[Finger of Death]] [[Forcecage]] [[Magnificent Mansion]] [[Mirage Arcane]] [[Mordenkainen’s Sword]] [[Mordenkainen's Magnificent Mansion]] [[Plane Shift]] [[Power Word Pain]] [[Prismatic Spray]] [[Project Image]] [[Reverse Gravity]] [[Sequester]] [[Simulacrum]] [[Symbol]] [[Teleport]] [[Whirlwind]] ">>
<<spelltable "[[Antipathy/Sympathy]] [[Dominate Monster]] [[Feeblemind]] [[Glibness]] [[Mind Blank]] [[Power Word Stun]]">>
<<spelltable "[[Antimagic Field]] [[Control Weather]] [[Earthquake]] [[Holy Aura]] [[Sunburst]]">>
<<spelltable "[[Animal Shapes]] [[Antipathy/Sympathy]] [[Control Weather]] [[Earthquake]] [[Feeblemind]] [[Incendiary Cloud]] [[Sunburst]] [[Tsunami]]">>

<<spelltable "[[Abi-Dalzim’s Horrid Wilting]] [[Demiplane]] [[Dominate Monster]] [[Earthquake]] [[Incendiary Cloud]] [[Power Word Stun]] [[Sunburst]]">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[8]sort[]]">>
<<spelltable "[[Demiplane]] [[Dominate Monster]] [[Feeblemind]] [[Glibness]] [[Maddening Darkness]]">>
<<spelltable "[[Abi-Dalzim’s Horrid Wilting]] [[Antimagic Field]] [[Antipathy/Sympathy]] [[Clone]] [[Control Weather]] [[Demiplane]] [[Dominate Monster]] [[Feeblemind]] [[Illusory Dragon]] [[Incendiary Cloud]] [[Maddening Darkness]] [[Maze]] [[Mighty Fortress]] [[Mind Blank]] [[Power Word Stun]] [[Sunburst]] [[Telepathy]] ">>
<<spelltable "[[Foresight]] [[Mass Polymorph]] [[Power Word Heal]] [[Power Word Kill]] [[Prismatic Wall]] [[Psychic Scream]] [[True Polymorph]]">>
<<spelltable "[[Astral Projection]] [[Gate]] [[Mass Heal]] [[Power Word Heal]] [[True Ressurection]]">>
<<spelltable "[[Foresight]] [[Shapechange]] [[Storm of Vengeance]] [[True Resurrection]]">>
<<spelltable "[[Blade of Disaster]] [[Gate]] [[Mass Polymorph]] [[Meteor Swarm]] [[Power Word Kill]] [[Psychic Scream]] [[Time Stop]] [[Wish]]">>
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[9]sort[]]">>
<<spelltable "[[Astral Projection]] [[Blade of Disaster]] [[Foresight]] [[Gate]] [[Imprisonment]] [[Power Word Kill]] [[Psychic Scream]] [[True Polymorph]] [[Weird]]">>
<<spelltable "[[Astral Projection]] [[Blade of Disaster]] [[Foresight]] [[Gate]] [[Imprisonment]] [[Invulnerability]] [[Mass Polymorph]] [[Meteor Swarm]] [[Power Word Kill]] [[Prismatic Wall]] [[Psychic Scream]] [[Shapechange]] [[Time Stop]] [[True Polymorph]] [[Weird]] [[Wish]]">>
Aberrations are utterly alien beings. Many of them have innate magical abilities drawn from the creature's alien mind rather than the mystical forces of the world. The quintessential aberrations are aboleths, beholders, mind flayers, and slaadi.

<<list-box "[tag[Aberration]sort[]]" "No aberrations found.">>
"""
''Amphibious.'' The aboleth can breathe air and water.
''Mucous Cloud.'' While underwater, the aboleth is surrounded by transformative mucus. A creature that <<touch>> the aboleth or that ''hits it with a melee attack'' while within <<range 5>> feet of it must make a <<save Con 14>>. On a failure, the creature is diseased for <<time 1d4>>. The diseased creature can breathe only underwater.
''Probing Telepathy.'' If a creature communicates telepathically with the aboleth, the aboleth learns the creature’s greatest desires if the aboleth can see the creature.
"""
[img[divider.png]]
''Multiattack.'' The aboleth makes three tentacle attacks.

<<fold "Aboleth Lair Action">>
<<fold "Aboleth Regional Effect">>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Tentacle +9>>|<<bludgeoning 2d6+5>> |<<reach 10>> |
|~|If the target is a creature, it must succeed on a <<save Con 14>> or become diseased. The disease has no effect for <<time 1m>> and can be removed by any magic that cures disease. After <<time 1m>>, the diseased creature’s skin becomes translucent and slimy, the creature can’t regain hit points unless it is underwater, and the disease can be removed only by heal or another disease-curing spell of 6th level or higher. When the creature is outside a body of water, it takes <<acid 1d12>> every <<time 10m>> unless moisture is applied to the skin before <<time 10m>> have passed. |<|
| !<<melee Tail +4>>|<<bludgeoning 3d6+5>> |<<reach 10>> |
| !Enslave|''3/Day''<br/>The aboleth targets one creature it can see within <<range 30>> of it. The target must succeed on a <<save Wis 14>> or be magically [[Charmed]] by the aboleth until the aboleth dies or until it is on a different plane of existence from the target. The [[Charmed]] target is under the aboleth’s control and can’t take <<reaction>>, and the aboleth and the target can communicate telepathically with each other over any distance.<br/>&nbsp;<br/>Whenever the charmed target takes damage, the target can repeat the saving throw. On a success, the effect ends. No more than once every <<time 24h>>, the target can also repeat the saving throw when it is at least <<range "1 mile">> away from the aboleth. |<|
| !<<action>> Legendary Actions |<|<|
|The aboleth can take ''3'' legendary actions, choosing from the options below. Only one legendary action option can be used at a time and only at the end of another creature’s turn. The aboleth regains spent legendary actions at the start of its turn. |<|<|
| !Detect|The aboleth makes a Wisdom (Perception) check. |<|
| !Tail Swipe|The aboleth makes one tail attack. |<|
| !Psychic Drain|''Costs 2 Actions''<br/>One creature [[Charmed]] by the aboleth takes <<psychic 3d6>>, and the aboleth regains hit points equal to the damage the creature takes. |
On initiative count 20 (losing initiative ties), the aboleth takes a lair action to cause one of the following effects:

* ''Phantasmal Force.'' The aboleth casts [[Phantasmal Force]] (no components required) on any number of creatures it can see within <<sphere 60>> of it. While maintaining concentration on this effect, the aboleth can’t take other lair actions. If a target succeeds on the saving throw or if the effect ends for it, the target is immune to the aboleth’s [[Phantasmal Force]] lair action for the next 24 hours, although such a creature can choose to be affected.
* ''Grasping TIde.'' Pools of water within 90 feet of the aboleth surge outward in a grasping tide. Any creature on the ground within <<circle 20>> of such a pool must succeed on a <<save Str 14>> or be pulled up to <<range 20>> into the water and knocked [[Prone]]. The aboleth can’t use this lair action again until it has used a different one.
* ''Aboleth Rage.'' Water in the aboleth’s lair magically becomes a conduit for the creature’s rage. The aboleth can target any number of creatures it can see in such water within <<sphere 90>> of it. A target must succeed on a <<save Wis 14>> or take <<psychic 2d6>>. The aboleth can’t use this lair action again until it has used a different one.
The region containing an aboleth’s lair is warped by the creature’s presence, which creates one or more of the following effects:

* Underground surfaces within 1 mile of the aboleth’s lair are slimy and wet and are <<difficult>>.
* Water sources within 1 mile of the lair are supernaturally fouled. Enemies of the aboleth that drink such water vomit it within minutes.
* As an <<action>>, the aboleth can create an illusory image of itself within 1 mile of the lair. The copy can appear at any location the aboleth has seen before or in any location a creature charmed by the aboleth can currently see. Once created, the image lasts for as long as the aboleth maintains concentration, as if concentrating on a spell. Although the image is intangible, it looks, sounds, and can move like the aboleth. The aboleth can sense, speak, and use telepathy from the image’s position as if present at that position. If the image takes any damage, it disappears.

If the aboleth dies, the first two effects fade over the course of <<time "3d10 days">>.
!!! YOUR SPELLBOOK

The spells that you add to your spellbook as you gain levels reflect the arcane research you conduct on your own, as well as intellectual breakthroughs you have had about the nature of the multiverse. You might find other spells during your adventures. You could discover a spell recorded on a scroll in an evil wizard’s chest, for example, or in a dusty tome in an ancient library.

''Copying a Spell into the Book.'' When you find a wizard spell of 1st level or higher, you can add it to your spellbook if it is of a spell level you can prepare and if you can spare the time to decipher and copy it.

Copying that spell into your spellbook involves reproducing the basic form of the spell, then deciphering the unique system of notation used by the wizard who wrote it. You must practice the spell until you understand the sounds or gestures required, then transcribe it into your spellbook using your own notation.

For each level of the spell, the process takes 2 hours and costs 50 gp. The cost represents material components you expend as you experiment with the spell to master it, as well as the fine inks you need to record it. Once you have spent this time and money, you can prepare the spell just like your other spells.

''Replacing the Book.'' You can copy a spell from your own spellbook into another book—for example, if you want to make a backup copy of your spellbook. This is just like copying a new spell into your spellbook, but faster and easier, since you understand your own notation and already know how to cast the spell. You need spend only 1 hour and 10 gp for each level of the copied spell.

If you lose your spellbook, you can use the same procedure to transcribe the spells that you have prepared into a new spellbook. Filling out the remainder of your spellbook requires you to find new spells to do so, as normal. For this reason, many wizards keep backup spellbooks in a safe place.

''The Book’s Appearance.'' Your spellbook is a unique compilation of spells, with its own decorative flourishes and margin notes. It might be a plain, functional leather volume that you received as a gift from your master, a finely bound gilt-edged tome you found in an ancient library, or even a loose collection of notes scrounged together after you lost your previous spellbook in a mishap.
A shimmering green arrow streaks toward a target within range and bursts in a spray of acid. Make a ranged spell attack against the target. On a hit, the target takes 4d4 acid damage immediately and 2d4 acid damage at the end of its next turn. On a miss, the arrow splashes the target with acid for half as much of the initial damage and no damage at the end of its next turn.
You hurl a bubble of acid. Choose one creature within range, or choose two creatures within range that are within 5 feet of each other. A target must succeed on a Dexterity saving throw or take <<acid 1d6>>. 

You have spent your life in the service of a temple to a specific god or pantheon of gods. You act as an intermediary between the realm of the holy and the mortal world, performing sacred rites and offering sacrifices in order to conduct worshipers into the presence of the divine. You are not necessarily a cleric—performing sacred rites is not the same thing as channeling divine power.

Choose a god, a pantheon of gods, or some other quasi-divine being, and work with your DM to detail the nature of your religious service. The Gods of the Multiverse section contains a sample pantheon, from the Forgotten Realms setting. Were you a lesser functionary in a temple, raised from childhood to assist the priests in the sacred rites? Or were you a high priest who suddenly experienced a call to serve your god in a different way? Perhaps you were the leader of a small cult outside of any established temple structure, or even an occult group that served a fiendish master that you now deny. 

"""
''Skills:'' Insight, Religion
''Languages:'' Two of your choice
''Equipment:''
A holy symbol
(a gift to you when you entered the priesthood)
a prayer book or prayer wheel
5 sticks of incense
vestments
a set of common clothes
a pouch containing 15 gp.
"""

<<fold "Shelter of the Faithful">>
"""
''Spellcasting.'' The acolyte is a 1st-level spellcaster. Its spellcasting ability is Wisdom (<<save "Spell DC" 12>>, <<casted "Spell Attack" +4>>). The acolyte has following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will) :'' [[Light]], [[Sacred Flame]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (3 slots):'' [[Bless]], [[Cure Wounds]], [[Sanctuary]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Club +2>>|<<bludgeoning 1d4>> |<<reach 5>> |
Starting at 2nd level, you can push yourself beyond your normal limits for a moment. On your turn, you can take one additional action.

Once you use this feature, you must finish a short or long rest before you can use it again. Starting at 17th level, you can use it twice before a rest, but only once on the same turn.
{{Action Surge}}
This suit of armor is reinforced with adamantine, one of the hardest substances in existence. While you're wearing it, any critical hit against you becomes a normal hit.

''Applicable Armor:'' Chain Shirt, Scale Mail, Breastplate, Half Plate, Ring Mail, Chain Mail, Splint, Plate
This drop down menu is intentionally left blank. You can add stuff here by tagging tiddlers with the <<tag TableOfContents>> tag.
At 10th level, you can choose a second option from the Fighting Style class feature.

<$list filter="[tag[Fighter]tag[Fighting Style]sort[]]"><p>{{||Link}}''.'' <$transclude tiddler=<<currentTiddler>>/></p></$list>
At 6th level, you learn two spells of your choice from any class. A spell you choose must be of a level you can cast, as shown on the Bard table, or a cantrip. The chosen spells count as bard spells for you but don’t count against the number of bard spells you know.
"""
''Amphibious.'' The dragon can breathe air and water.
''Legendary Resistance (3/Day).'' If the dragon fails a saving throw, it can choose to succeed instead.
"""
<<divider>>
''Multiattack.'' The dragon can use its Frightful Presence. It then makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +11>>|<<piercing 2d10+6>>+<<acid 1d8>> |<<reach 15>> |
| !<<melee Claw +11>>|<<slashing 2d6+6>> |<<reach 5>> |
| !<<melee Tail +11>>|<<bludgeoning 2d8+6>> |<<reach 15>> |
| !Frightful Presence|Each creature of the dragon’s choice that is within <<range 120>> of the dragon and aware of it must succeed on a <<save Wis 16>> or become [[Frightened]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to the dragon’s Frightful Presence for the next <<time 24h>>. |<|
| !Acid Breath|''Recharge on 5–6''<br/>The dragon exhales acid in a 60-foot line that is 5 feet wide. Each creature in that line must make a <<save Dex 18>>, taking <<acid 12d8>> on a failed save, or <<halved>> on a successful one. |<|
| !<<action>> Legendary Actions |<|<|
|The dragon can take ''3'' legendary actions, choosing from the options below. Only one legendary action option can be used at a time and only at the end of another creature’s turn. The dragon regains spent legendary actions at the start of its turn. |<|<|
| !Detect|The dragon makes a Wisdom (Perception) check. |<|
| !Tail Attack|The dragon makes a tail attack. |<|
| !Wing Attack|''Costs 2 Actions''<br/>The dragon beats its wings. Each creature within <<range 10>> of the dragon must succeed on a <<save Dex 19>> or take <<bludgeoning 2d6+6>> and be knocked [[Prone]]. The dragon can then fly up to half its flying speed. |<|
{{$:/AdvancedSearch}}
<<list-icons "[tag[Adventure]sort[order]]" "0 campaigns found.">>
''Prerequisite:'' Eldritch Blast Cantrip

When you cast eldritch blast, add your Charisma modifier to the damage it deals on a hit.

Your spell bolsters your allies with toughness and resolve. 
Choose up to three creatures within range. Each target’s hit point maximum and current hit points increase by 5 for the duration.
"""
''Air Form.'' The elemental can enter a hostile creature's space and stop there. It can move through a space as narrow as 1 inch wide without squeezing.
"""

---
''Multiattack.'' The elemental makes two slam attacks.

| !Attack | !Damage | !Properties |
|!<<melee Slam +8>> |<<bludgeoning 2d8+5>> |<<reach 5>> |
|^!Whirlwind<br/>(Recharge 4-6) |Each creature in the elemental's space must make a <<save Str 13>> saving throw. On a failure, a target takes <<bludgeoning 3d8+2>> and is flung up 20 feet away from the elemental in a random direction and knocked [[Prone]]. If a thrown target strikes an object, such as a wall or floor, the target takes <<bludgeoning 1d6>> for every 10 feet it was thrown. If the target is thrown at another creature, that creature must succeed on a <<save Dex 13>> saving throw or take the same damage and be knocked prone.<br/>If the saving throw is successful, the target takes half the bludgeoning damage and isn't flung away or knocked prone. |<|
You set an alarm against unwanted intrusion. 
Choose a door, a window, or an area within range that is no larger than a 20-foot cube. Until the spell ends, an alarm alerts you whenever a tiny or larger creature touches or enters the warded area. When you cast the spell, you can designate creatures that won’t set off the alarm. You also choose whether the alarm is mental or audible. 

A mental alarm alerts you with a ping in your mind if you are within 1 mile of the warded area. This ping awakens you if you are sleeping. 
An audible alarm produces the sound of a hand bell for 10 seconds within 60 feet.
Alchemist’s supplies enable a character to produce useful concoctions, such as acid or alchemist’s fire.

''Components.'' Alchemist’s supplies include:

* two glass beakers
* a metal frame to hold a beaker in place over an open flame
* a glass stirring rod
* a small mortar and pestle
* a pouch of common alchemical ingredients, including 
** salt
** powdered iron
** purified water

''Arcana.'' Proficiency with alchemist’s supplies allows you to unlock more information on Arcana checks involving potions and similar materials.

''Investigation.'' When you inspect an area for clues, proficiency with alchemist’s supplies grants additional insight into any chemicals or other substances that might have been used in the area.

''Alchemical Crafting.'' You can use this tool proficiency to create alchemical items. A character can spend money to collect raw materials, which weigh 1 pound for every 50 gp spent. The DM can allow a character to make a check using the indicated skill with advantage. As part of a long rest, you can use alchemist’s supplies to make one dose of acid, alchemist’s fire, antitoxin, oil, perfume, or soap. Subtract half the value of the created item from the total gp worth of raw materials you are carrying.

| !Activity | !DC |
|!Create a puff of thick smoke | 10 |
|!Identify a poison | 10 |
|!Identify a substance | 15 |
|!Start a fire | 15 |
|!Neutralize acid | 20 |
You assume a different form. When you cast the spell, choose one of the following options, the effects of which last for the duration of the spell. While the spell lasts, you can end one option as an action to gain the benefits of a different one.

''Aquatic Adaptation.'' You adapt your body to an aquatic environment, sprouting gills and growing webbing between your fingers. You can breathe underwater and gain a swimming speed equal to your walking speed.

''Change Appearance.'' You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another race, though none of your statistics change. You also can't appear as a creature of a different size than you, and your basic shape stays the same; if you're bipedal, you can't use this spell to become quadrupedal, for instance. At any time for the duration of the spell, you can use your action to change your appearance in this way again.

''Natural Weapons.'' You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your unarmed strikes deal 1d6 bludgeoning, piercing, or slashing damage, as appropriate to the natural weapon you chose, and you are proficient with your unarmed strikes. Finally, the natural weapon is magic and you have a +1 bonus to the attack and damage rolls you make using it.
You have a +1 bonus to attack and damage rolls made with this piece of magic ammunition. The bonus is determined by the rarity of the ammunition. Once it hits a target, the ammunition is no longer magical.
You have a +2 bonus to attack and damage rolls made with this piece of magic ammunition. The bonus is determined by the rarity of the ammunition. Once it hits a target, the ammunition is no longer magical.
You have a +3 bonus to attack and damage rolls made with this piece of magic ammunition. The bonus is determined by the rarity of the ammunition. Once it hits a target, the ammunition is no longer magical.
You have a bonus to attack and damage rolls made with this piece of magic ammunition. The bonus is determined by the rarity of the ammunition. Once it hits a target, the ammunition is no longer magical.
Your Constitution score is 19 while you wear this amulet. It has no effect on you if your Constitution is 19 or higher without it.
While wearing this amulet, you are hidden from divination magic. You can’t be targeted by such magic or perceived through magical scrying sensors.
While wearing this amulet, you can use an action to name a location that you are familiar with on another plane of existence. Then make a <<skillcheck Int 15>>. On a successful check, you cast the [[Plane Shift]] spell. On a failure, you and each creature and object within 15 feet of you travel to a random destination. 

* Roll <<roll d100>>. 
** ''On a 1–60,'' you travel to a random location on the plane you named. 
** ''On a 61–100,'' you travel to a randomly determined plane of existence.
"""
''Amphibious.'' The dragon can breathe air and water.
''Legendary Resistance (3/Day).'' If the dragon fails a saving throw, it can choose to succeed instead.
"""
<<divider>>
''Multiattack.'' The dragon can use its Frightful Presence. It then makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +15>>|<<piercing 2d10+8>>+<<acid 2d8>> |<<reach 15>> |
| !<<melee Claw +15>>|<<slashing 2d6+8>> |<<reach 10>> |
| !<<melee Tail +15>>|<<bludgeoning 2d8+8>> |<<reach 20>> |
| !Frightful Presence|Each creature of the dragon’s choice that is within <<range 120>> of the dragon and aware of it must succeed on a <<save Wis 19>> or become [[Frightened]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to the dragon’s Frightful Presence for the next <<time 24h>>. |<|
| !Acid Breath|''Recharge on 5–6''<br/>The dragon exhales acid in a 90-foot line that is 10 feet wide. Each creature in that line must make a <<save Dex 22>>, taking <<acid 15d8>> on a failed save, or <<halved>> on a successful one. |<|
| !<<action>> Legendary Actions |<|<|
|The dragon can take ''3'' legendary actions, choosing from the options below. Only one legendary action option can be used at a time and only at the end of another creature’s turn. The dragon regains spent legendary actions at the start of its turn. |<|<|
| !Detect|The dragon makes a Wisdom (Perception) check. |<|
| !Tail Attack|The dragon makes a tail attack. |<|
| !Wing Attack|''Costs 2 Actions''<br/>The dragon beats its wings. Each creature within <<range 15>> of the dragon must succeed on a <<save Dex 23>> or take <<bludgeoning 2d6+8>> and be knocked [[Prone]]. The dragon can then fly up to half its flying speed. |<|
"""
''Inscrutable.'' The sphinx is immune to any effect that would sense its emotions or read its thoughts, as well as any divination spell that it refuses. Wisdom (Insight) checks made to ascertain the sphinx’s intentions or sincerity have disadvantage.
''Magic Weapons.'' The sphinx’s weapon attacks are magical.
''Spellcasting.'' The sphinx is a 12th-level spellcaster. Its spellcasting ability is Wisdom (<<save "Save DC" 18>>, <<casted "Spell Attack" +10>>). It requires no material components to cast its spells. The sphinx has the following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Sacred Flame]], [[Spare the Dying]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Command]], [[Detect Evil and Good]], [[Detect Magic]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Lesser Restoration]], [[Zone of Truth]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Dispel Magic]], [[Tongues]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Banishment]], [[Freedom of Movement]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (2 slots):'' [[Flame Strike]], [[Greater Restoration]]
&nbsp;&nbsp;&nbsp;&nbsp;''6th level (1 slot):'' [[Heroes' Feast]]
"""
<<divider>>
''Multiattack.'' The sphinx makes two claw attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +12>>|<<slashing 2d10+6>> |<<reach 5>>|
| !Roar|''3/Day.''<br/>The sphinx emits a magical roar. Each time it roars before finishing a long rest, the roar is louder and the effect is different, as detailed below. Each creature within 500 feet of the sphinx and able to hear the roar must make a saving throw.<br/>&nbsp;''First Roar.'' Each creature that fails a <<save Wis 18>> is <fail>[[Frightened]] for <<time 1m>></fail>. A [[Frightened]] creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success.<br/>''Second Roar.'' Each creature that fails a <<save Wis 18>> is <fail>[[Deafened]] and [[Frightened]] for <<time 1m>></fail>. A [[Frightened]] creature is [[Paralyzed]] and can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success.<br/>''Third Roar.'' Each creature makes a <<save Con 18>>. On a failed save, a creature takes <fail><<thunder 8d10>> and is knocked [[Prone]]</fail>. On a successful save, the creature takes <pass><<halved>></pass> and isn’t knocked [[Prone]]. |<|
| !<<action>> Legendary Actions (3/Round) |<|<|
| !Claw Attack|The sphinx makes one claw attack. |<|
| !Teleport|''Costs 2 Actions.''<br/>The sphinx magically teleports, along with any equipment it is wearing or carrying, up to 120 feet to an unoccupied space it can see. |<|
| !Cast a Spell|''Costs 3 Actions.''<br/>The sphinx casts a spell from its list of prepared spells, using a spell slot as normal. |<|
| !<<action>> Lair Actions @ Initiative 20 |<|<|
|The flow of time is altered such that every creature in the lair must reroll initiative. The sphinx can choose not to reroll. |<|<|
|The effects of time are altered such that every creature in the lair must succeed on a <<save Con 15>> or become <<time "1d20 years">> older or younger (the sphinx’s choice), but never any younger than 1 year old. A [[Greater Restoration]] spell can restore a creature’s age to normal. |<|<|
|The flow of time within the lair is altered such that everything within moves up to 10 years forward or backward (sphinx’s choice). Only the sphinx is immediately aware of the time change. A [[Wish]] spell can return the caster and up to seven other creatures designated by the caster to their normal time. |<|<|
|The sphinx shifts itself and up to seven other creatures it can see within in its lair to another plane of existence. Once outside its lair, the sphinx can’t use lair actions, but it can return to its lair as a bonus action on its turn, taking up to seven creatures with it. |<|<|
This spell lets you convince a beast that you mean it no harm.
Choose a beast that you can see within range. It must see and hear you. If the beast’s Intelligence is 4 or higher, the spell fails. Otherwise, the beast must succeed on a Wisdom saving throw or be [[Charmed]] by you for the spell’s duration. If you or one of your companions harms the target, the spell ends.
By means of this spell, you use an animal to deliver a message.
Choose a Tiny beast you can see within range, such as a squirrel, a blue ray, or a bat. You specify a location, which you must have visited, and a recipient who matches a general description, such as a man or woman dressed in the uniform of the town guard or a red-haired dwarf wearing a pointed hat. You also speak a message of up to twenty-five words. The target beast travels for the duration of the spell towards the specified location, covering about 50 miles per 24 hours for a flying messenger or 25 miles for other animals.

When the messenger arrives, it delivers your message to the creature that you described, replicating the sound of your voice. The messenger speaks only to a creature matching the description you gave. If the messenger doesn’t reach its destination before the spell ends, the message is lost, and the beast makes it way back to where you cast this spell.
Your magic turns others into beasts. 
Choose any number of willing creatures that you can see within range. You transform each target into the form of a large or smaller beast with a challenge rating of 4 or lower. On subsequent turns, you can use your actions to transform affected creatures into new forms.

The transformation lasts for the duration for each target, or until the target drops to 0 hit points or dies. You can choose a different form for each target. A target’s game statistics are replaced by the statistics of the chosen beast, though the target retains its alignment and Intelligence, Wisdom, and Charisma scores. The target assumes the hit points of its new form, and when it reverts to its normal form, it returns to the number of hit point it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn’t reduce the creature’s normal form to 0 hit points, it isn’t knocked [[Unconscious]]. The creature is limited in the actions it can perform by the nature of its new form, and it can’t speak or cast spells. 

The target’s gear melds into the new form. The target can’t activate, wield, or otherwise benefit from any of its equipment.
This spell creates an undead servant. 
Choose a pile of bones or a corpse of a Medium or Small humanoid within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a [[Skeleton]] if you chose bones or a [[Zombie]] if you chose a corpse (the DM has the creature’s game statistics). 

On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 60 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete.

The creature is under your control for 24 hours, after which it stops obeying any command you’ve given it. To maintain the control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends. This use of the spell reasserts your control over up to four creatures you have animated with this spell, rather than animating a new one.
Objects come to life at your command. Choose up to ten nonmagical objects within range that are not being worn or carried. Medium targets count as two objects, Large targets count as four objects, Huge targets count as eight objects. You can’t animate any object larger than Huge. Each target animates and becomes a creature under your control until the spell ends or until reduced to 0 hit points. 

As a bonus action, you can mentally command any creature you made with this spell if the creature is within 500 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete. 

| !Animated Object Statistics  |<|<|<|<|<|<|
| !Size | !HP | !AC | !Attack | !Damage | !Str | !Dex |
|!Tiny | 20 | 18 | +8 | 1d4 + 4 | 4 | 8 |
|!Small | 25 | 16 | +6 | 1d8 + 2 | 6 | 14 |
|!Medium | 40 | 13 | +5 | 2d6 + 1 | 10 | 12 |
|!Large | 50 | 10 | +6 | 2d10 + 2 | 14 | 10 |
|!Huge | 80 | 10 | +8 | 2d12 + 4 | 18 | 6  |

''See:'' [[Animate Objects Table]]

An animated object is a construct with AC, hit points, attacks, Strength, and Dexterity determine by its size. Its Constitution is 10 and its Intelligence and Wisdom are 3, and its Charisma is 1. Its speed is 30 feet; if the objects lack legs or other appendages it can use for locomotion, it instead has a flying speed of 30 feet and can hover. If the object is securely attached to a surface or larger object, such as a chain bolted to a wall, its speed is 0. It has blindsight with a radius of 30 feet and is blind beyond that distance. When the animated object drops to 0 hit points, it reverts to its original object form, and any remaining damage carries over to its original object form. 

If you command an object to attack, it can make a single melee attack against a creature within 5 feet of it. It makes a slam attack with an attack bonus and bludgeoning damage determine by its size. The DM might rule that a specific object inflicts slashing or piercing damage based on its form.
<<tabs "[[Tiny Animated Objects]] [[Small Animated Objects]] [[Medium Animated Objects]] [[Large Animated Objects]] [[Huge Animated Objects]]">>
"""
''Antimagic Susceptibility.'' The armor is incapacitated while in the area of an antimagic field. If targeted by [[Dispel Magic]], the armor must succeed on a <<save Con>> vs the caster’s spell save DC or fall unconscious for <<time 1m>>.
''False Appearance.'' While the armor remains motionless, it is indistinguishable from a normal suit of armor.
"""
[img[divider.png]]
Multiattack. The armor makes two melee attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Slam +4>>|<<bludgeoning 1d6+2>> |<<reach 5>> |
While holding this shield, you can speak its command word as a bonus action to cause it to animate. The shield leaps into the air and hovers in your space to protect you as if you were wielding it, leaving your hands free. The shield remains animated for <<time 1m>>, until you use a bonus action to end this effect, or until you are [[Incapacitated]] or die, at which point the shield falls to the ground or into your hand if you have one free.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<slashing 2d6+3>> + <<acid 1d6>> |<<reach 5>> |
|~|If the target is a Large or smaller creature, it is [[Grappled]] <<save Escape 13>>. Until this grapple ends, the ankheg can bite only the [[Grappled]] creature and has advantage on attack rolls to do so. |<|
| !Acid Spray|''Recharge on 6''<br/>The ankheg spits acid in a line that is 30 feet long and 5 feet wide, provided that it has no creature [[Grappled]]. Each creature in that line must make a <<save Dex 13>>, taking <<acid 3d6>> on a failed save, or <<halved>> on a successful one. |<|
A shimmering barrier extends out from you in a 10-foot radius and moves with you, remaining centered on you and hedging out creatures other than undead and constructs. 
The barrier lasts for the duration. The barrier prevents an affected creature from passing or reaching through. An affected creature can cast spells or make attacks with ranged or reach weapons through the barrier. 
If you move so that an affect creature is forced to pass through the barrier, the spell ends.
A 10-foot-radius invisible sphere of antimagic surrounds you. 
This area is divorced from the magical energy that suffeses the multiverse. Within the sphere, spells can’t be cast, summoned creatures disappear, and even magic items become mundane. Until the spell ends, the spere moves with you, centered on you. 
Spells and other magical effects, except those created by an artifact or a deity, are suppressed in the sphere and can’t protrude into it. A slot expended to cast a suppressed spell is consumed. While an effect is suppressed, it doesn’t function, but the time it spends suppressed counts against its duration. 

''Targeted Effects.'' Spells and other magical effects, such as magic missle and charm person, that target a creature or an object in the sphere have no effect on that target. 

''Areas of Magic.'' The area of another spell or magical effect, such as fireball, can’t extend into the sphere. If the sphere overlaps an area of magic, the part of the area that is covered by the sphere is suppressed. For example, the flames created by a wall of fire are suppressed within the sphere, creating a gap in the wall if the overlap is large enough. 

''Spells.'' Any active spell or other magical effect on a creature or an object in the sphere is suppressed while the creature or object is in it. 

''Magic Items.'' The properties and powers of magic items are suppressed in the sphere. Forexample, a +1 longsword in the sphere functions as a nonmagical longsword. A magic weapon’s properties and powers are suppressed if it is used against a target in the sphere or wielded by an attacker in the sphere. If a magic weapon or piece of magic ammunition fully leaves the sphere (For example, if you fire a magic arrow or throw a magic spear at a target outside the sphere), the magic of the item ceases to be supressed as soon as it exits. 

''Magical Travel.'' Teleportation and planar travel fail to work in the sphere, whether the sphere is the destination or the departure point for such magical travel. A portal to another location, world, or plane of existence, as well as an opening to an extradimensional space such as that created by the rope trick spells, temporarily closes while in the sphere. 

''Creatures and Objects.'' A creature or object summoned or created by magic temporarily winks out of existence in the sphere. Such a creature instantly reappears once the space the creature occupied is no longer withinthe sphere. 

''Dispel Magic.'' Spells and magical effects such as dispel magic have no effect on the sphere. Likewise, the spheres created by different antimagic field spells don’t nullify each other.
This spell attracts or repels creatures of your choice. 
You target something within range, either a Huge or smaller object or creature or an area that is no larger than a 200-foot cube. Then specify a kind of intelligent creature, such as red dragons, goblins, or vampires. You invest the target with an aura that either attracts or repels the specified creatures for the duration. Choose antipathy or sympathy as the aura’s effect.&nbsp;

Antipathy. 
The enchantment causes creatures of the&nbsp;kind you designated to feel an intense urge to leave the&nbsp;area and avoid the target. When such a creature can&nbsp;see the target or comes within 60 feet of it, the creature&nbsp;must succeed on a Wisdom saving throw or become&nbsp;frightened. The creature remains frightened while it can&nbsp;see the target or is within 60 feet of it. While frightened&nbsp;by the target, the creature must use its movement to&nbsp;move to the nearest safe spot from which it can’t see&nbsp;the target. If the creature moves more than 60 feet from&nbsp;the target and can’t see it, the creature is no longer&nbsp;frightened, but the creature becomes frightened again if&nbsp;it regains sight of the target or moves within 60 feet of it.&nbsp;

Sympathy. 
The enchantment causes the specified&nbsp;creatures to feel an intense urge to approach the target&nbsp;while within 60 feet of it or able to see it. When such a&nbsp;creature can see the target or comes within 60 feet o fit,&nbsp;the creature must succeed on a Wisdom saving throw or&nbsp;use its movement on each of its turns to enter the area&nbsp;or move within reach of the target. When the creature&nbsp;has done so, it can’t willingly move away from the target.&nbsp;If the target damages or otherwise harms an affected&nbsp;creature, the affected creature can make a Wisdom&nbsp;saving throw to end the effect, as described below.&nbsp;

Ending the Effect. 
If an affected creature ends its&nbsp;turn while not within 60 feet of the target or able to see&nbsp;it, the creature makes a Wisdom saving throw. On a&nbsp;successful save, the creature is no longer affected by&nbsp;the target and recognizes the feeling of repugnance or&nbsp;attraction as magical. In addition, a creature affected by&nbsp;the spell is allowed another Wisdom saving throw every&nbsp;24 hours while the spell persists.&nbsp;
A creature that successfully saves against this effect&nbsp;is immune to it for 1 minute, after which time it can be&nbsp;affected again.
''Multiattack.'' The ape makes two fist attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Fist +5>>|<<bludgeoning 1d6+3>> |<<reach 5>> |
| !<<ranged Rock +5>>|<<bludgeoning 1d6+3>> |<<range 25/50>> |
This item first appears to be a Large sealed iron barrel weighing 500 pounds. The barrel has a hidden catch, which can be found with a successful <<investigation 20>>. Releasing the catch unlocks a hatch at one end of the barrel, allowing two Medium or smaller creatures to crawl inside. Ten levers are set in a row at the far end, each in a neutral position, able to move either up or down. When certain levers are used, the apparatus transforms to resemble a giant lobster.

The apparatus of the Crab is a Large object with the following statistics:

"""
<<ac 20>>, <<hp 200>>
''Speed:'' 30 ft., swim 30 ft. (or 0 ft. for both if the legs and tail aren’t extended)
''Damage Immunities:'' poison, psychic
"""

To be used as a vehicle, the apparatus requires one pilot. While the apparatus’s hatch is closed, the compartment is airtight and watertight. The compartment holds enough air for <<time 10h>> of breathing, divided by the number of breathing creatures inside.

The apparatus floats on water. It can also go underwater to a depth of 900 feet. Below that, the vehicle takes <<bludgeoning 2d6>> per minute from pressure.

A creature in the compartment can use an action to move as many as two of the apparatus’s levers up or down. After each use, a lever goes back to its neutral position. Each lever, from left to right, functions as shown in the [[Apparatus of the Crab Levers]] table.

{{Apparatus of Kwalish Levers}}
|max top|k
| !Lever | !Up | !Down |
| !1 |Legs and tail extend, allowing the apparatus to walk and swim. |Legs and tail retract, reducing the apparatus’s speed to 0 and making it unable to benefit from bonuses to speed. |
| !2 |Forward window shutter opens. |Forward window shutter closes. |
| !3 |Side window shutters open (two per side). |Side window shutters close (two per side). |
| !4 |Two claws extend from the front sides of the apparatus. |The claws retract. |
| !5 |Each extended claw makes the following melee weapon attack: <br/><<melee Claw +8>>, <<reach 5>>, one target. <br/>''Hit:'' <<bludgeoning 2d6>>. |Each extended claw makes the following melee weapon attack: <br/><<melee Claw +8>>, <<reach 5>>, one target. <br/>''Hit:'' The target is [[Grappled]] (<<skillcheck Escape 15>>). |
| !6 |The apparatus walks or swims forward. |The apparatus walks or swims backward. |
| !7 |The apparatus turns 90 degrees left. |The apparatus turns 90 degrees right. |
| !8 |Eyelike fixtures emit <<bright 30>> and an additional <<dim 30>>. |The light turns off. |
| !9 |The apparatus sinks as much as 20 feet in liquid. |The apparatus rises up to 20 feet in liquid. |
| !10 |The rear hatch unseals and opens. |The rear hatch closes and seals. |
You create an invisible, magical eye within range that hovers in the air for the duration. 
You mentally receive visual information from the eye, which has normal vision and darkvision out to 30 feet. The eye can look in every direction. 
As an action, you can move the eye up to 30 feet in any direction. There is no limit to how far away from you the eye can move, but it can’t enter another plane of existence. A solid barrier blocks the eye’s movement, but the eye can pass through an opening as small as 1 inch in diameter.
You create a Large hand of shimmering, translucent force in an unoccupied space that you can see within range. The hand lasts for the spell's duration, and it moves at your command, mimicking the movements of your own hand.

The hand is an object that has AC 20 and hit points equal to your hit point maximum. If it drops to 0 hit points, the spell ends. It has a Strength of 26 (+8) and a Dexterity of 10 (+0). The hand doesn't fill its space. 
When you cast the spell and as a bonus action on your subsequent turns, you can move the hand up to 60 feet and then cause one of the following effects with it.

''Clenched Fist.'' The hand strikes one creature or object within 5 feet of it. Make a melee spell attack for the hand using your game statistics. On a hit, the target takes 4d8 force damage.

''Forceful Hand.'' The hand attempts to push a creature within 5 feet of it in a direction you choose. Make a check with the hand's Strength contested by the Strength (Athletics) check of the target. If the target is Medium or smaller, you have advantage on the check. If you succeed, the hand pushes the target up to 5 feet plus a number of feet equal to five times your spellcasting ability modifier. The hand moves with the target to remain within 5 feet of it.

''Grasping Hand.'' The hand attempts to grapple a Huge or smaller creature within 5 feet of it. You use the hand's Strength score to resolve the grapple. If the target is Medium or smaller, you have advantage on the check. While the hand is grappling the target, you can use a bonus action to have the hand crush it. When you do so, the target takes bludgeoning damage equal to 2d6 + your spellcasting ability modifier.

''Interposing Hand.'' The hand interposes itself between you and a creature you choose until you give the hand a different command. The hand moves to stay between you and the target, providing you with half cover against the target. The target can't move through the hand's space if its Strength score is less than or equal to the hand's Strength score. If its Strength score is higher than the hand's Strength score, the target can move toward you through the hand's space, but that space is difficult terrain for the target.
You touch a closed door, window, gate, chest, or other entryway, and it becomes locked for the duration. 
You and the creatures you designate when you cast this spell can open the object normally. You can also set a password that, when spoken within 5 feet of the object, suppresses this spell for 1 minute. Otherwise, it is impassable until it is broken or the spell is dispelled or suppressed. Casting knock on the object suppresses arcane lock for 10 minutes. 

While affected by this spell, the object is more difficult to break or force open; the DC to break it or pick any locks on it increases by 10.
You have learned to regain some of your magical energy by studying your spellbook. Once per day when you finish a short rest, you can choose expended spell slots to recover. The spell slots can have a combined level that is equal to or less than half your wizard level (rounded up), and none of the slots can be 6th level or higher.

For example, if you’re a 4th-level wizard, you can recover up to two levels worth of spell slots. You can recover either a 2nd-level spell slot or two 1st-level spell slots.
You create a sword-shaped plane of force that hovers within range. It lasts for the duration.

When the sword appears, you make a melee spell attack against a target of your choice within 5 feet of the sword. On a hit, the target takes 3d10 force damage. Until the spell ends, you can use a bonus action on each of your turns to move the sword up to 20 feet to a spot you can see and repeat this attack against the same target or a different one.
When you reach 2nd level, you choose an arcane tradition, shaping your practice of magic through one of eight schools: Abjuration, Conjuration, Divination, Enchantment, Evocation, Illusion, Necromancy, or Transmutation. The School of Evocation is detailed at the end of the class description, and more choices are available in other sources.

Your choice grants you features at 2nd level and again at 6th, 10th, and 14th level.
You place an illusion on a creature or an object you touch so that divination spells reveal false information about it. The target can be a willing creature or an object that isn't being carried or worn by another creature. 
When you cast the spell, choose one or both of the following effects. The effect lasts for the duration. If you cast this spell on the same creature or object every day for 30 days, placing the same effect on it each time, the illusion lasts until it is dispelled.

''False Aura.'' You change the way the target appears to spells and magical effects, such as detect magic, that detect magical auras. You can make a nonmagical object appear magical, a magical object appear nonmagical, or change the object's magical aura so that it appears to belong to a specific school of magic that you choose. When you use this effect on an object, you can make the false magic apparent to any creature that handles the item.

''Mask.'' You change the way the target appears to spells and magical effects that detect creature types, such as a paladin's Divine Sense or the trigger of a symbol spell. You choose a creature type and other spells and magical effects treat the target as if it were a creature of that type or of that alignment.
At 20th level, you can use your Wild Shape an unlimited number of times.

Additionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.
You gain a +2 bonus to attack rolls you make with ranged weapons.
"""
''Magic Resistance.'' The archmage has advantage on saving throws against spells and other magical effects.
''Spellcasting.'' The archmage is an 18th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 17>>, <<casted "Spell Attack" +9>>). The archmage can cast [[Disguise Self]] and [[Invisibility]] at will and has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Fire Bolt]], [[Light]], [[Mage Hand]], [[Prestidigitation]], [[Shocking Grasp]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Detect Magic]], [[Identify]], [[Mage Armor]]*, [[Magic Missile]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Detect Thoughts]], [[Mirror Image]], [[Misty Step]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Counterspell]], [[Fly]], [[Lightning Bolt]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Banishment]], [[Fire Shield]], [[Stoneskin]]*
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (3 slots):'' [[Cone of Cold]], [[Scrying]], [[Wall of Force]]
&nbsp;&nbsp;&nbsp;&nbsp;''6th level (1 slot):'' [[Globe of Invulnerability]]
&nbsp;&nbsp;&nbsp;&nbsp;''7th level (1 slot):'' [[Teleport]]
&nbsp;&nbsp;&nbsp;&nbsp;''8th level (1 slot):'' [[Mind Blank]]*
&nbsp;&nbsp;&nbsp;&nbsp;''9th level (1 slot):'' [[Time Stop]]
*The archmage casts these spells on itself before combat."""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Dagger +6>>|<<piercing 1d4+2>> |<<reach 5>><br/><<range 20/60>> |
| !Druid Level | !Spells |
| !3rd |[[Hold Person]], [[Spike Growth]] |
| !5th |[[Sleet Storm]], [[Slow]] |
| !7th |[[Freedom of Movement]], [[Ice Storm]] |
| !9th |[[Commune with Nature]], [[Cone of Cold]] |
|max|k
| !Armor | !Cost (gp) | !Armor Class (AC) | !Strength | !Stealth | !Weight (lb.) |
| !Light Armor |<|<|<|<|<|
|!Padded | 5 |11 + Dex modifier | &mdash; | Disadvantage | 8 |
|!Leather | 10 |11 + Dex modifier | &mdash; | &mdash; | 10 |
|!Studded leather | 45 |12 + Dex modifier | &mdash; | &mdash; | 13 |
| !Medium Armor |<|<|<|<|<|
|!Hide | 10 |12 + Dex modifier (max 2) | &mdash; | &mdash; | 12 |
|!Chain shirt | 50 |13 + Dex modifier (max 2) | &mdash; | &mdash; | 20 |
|!Scale mail | 50 |14 + Dex modifier (max 2) | &mdash; | Disadvantage | 45 |
|!Breastplate | 400 |14 + Dex modifier (max 2) | &mdash; | &mdash; | 20 |
|!Half plate | 750 |15 + Dex modifier (max 2) | &mdash; | Disadvantage | 40 |
| !Heavy Armor |<|<|<|<|<|
|!Ring mail | 30 |14 | &mdash; | Disadvantage | 40 |
|!Chain mail | 75 |16 | Str 13 | Disadvantage | 55 |
|!Splint | 200 |17 | Str 15 | Disadvantage | 60 |
|!Plate | 1,500 |18 | Str 15 | Disadvantage | 65 |
| !Shield |<|<|<|<|<|
|!Shield | 10 |+2 | &mdash; | &mdash; | 6 |
You have resistance to nonmagical damage while you wear this armor. Additionally, you can use an action to make yourself immune to nonmagical damage for <<time 10m>> or until you are no longer wearing the armor. Once this special action is used, it can’t be used again until the next dawn.
You have resistance to one type of damage while you wear this armor. The DM chooses the type or determines it randomly from the options below.

| !d10 | !Damage Type |
| !1 |Acid |
| !2 |Cold |
| !3 |Fire |
| !4 |Force |
| !5 |Lightning |
| !6 |Necrotic |
| !7 |Poison |
| !8 |Psychic |
| !9 |Radiant |
| !10 |Thunder |
You can cast mage armor on yourself at will, without expending a spell slot or material components.
While wearing this armor, you have resistance to one of the following damage types: bludgeoning, piercing, or slashing. The DM chooses the type or determines it randomly.

''Curse.'' This armor is cursed, a fact that is revealed only when an [[Identify]] spell is cast on the armor or you attune to it. Attuning to the armor curses you until you are targeted by the [[Remove Curse]] spell or similar magic; removing the armor fails to end the curse. While cursed, you have vulnerability to two of the three damage types associated with the armor (not the one to which it grants resistance).
You have a +1 bonus to AC while wearing this armor. The bonus is determined by its rarity.
You have a +2 bonus to AC while wearing this armor. The bonus is determined by its rarity.
You have a +3 bonus to AC while wearing this armor. The bonus is determined by its rarity.
You have a bonus to AC while wearing this armor. The bonus is determined by its rarity.
Whenever you make an Intelligence (History) check related to magic items, alchemical objects, or technological devices, you can add twice your proficiency bonus, instead of any proficiency bonus you normally apply.
''Prerequisite:'' 9th level

You can cast levitate on yourself at will, without expending a spell slot or material components.

''Prerequisite:'' Pact of the Tome feature

You no longer need to sleep and can’t be forced to sleep by any means. To gain the benefits of a long rest, you can spend all 8 hours doing light activity, such as reading your Book of Shadows and keeping watch.

"""
''Assassinate.'' During its first turn, the assassin has advantage on attack rolls against any creature that hasn’t taken a turn. Any hit the assassin scores against a surprised creature is a critical hit.
''Evasion.'' If the assassin is subjected to an effect that allows it to make a Dexterity saving throw to take only half damage, the assassin instead takes no damage if it succeeds on the saving throw, and only half damage if it fails.
''Sneak Attack (1/Turn).'' The assassin deals an extra <<damage 4d6>> when it hits a target with a weapon attack and has advantage on the attack roll, or when the target is within 5 feet of an ally of the assassin that isn’t [[Incapacitated]] and the assassin doesn’t have disadvantage on the attack roll."""
<<divider>>
''Multiattack.'' The assassin makes two shortsword attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +6>>|<<piercing 1d6+3>> |<<reach 5>> |
|~|The target must make a <<save Con 15>>, <fail><<poison 7d6>></fail>, <pass><<halved>></pass>. |<|
| !<<ranged "Light Crossbow" +6>>|<<piercing 1d8+3>> |<<range 80/320>> |
|~|The target must make a <<save Con 15>>, <fail><<poison 7d6>></fail>, <pass><<halved>></pass>. |<|
"""
''Price per Dose:'' 150 gp
"""

* A creature subjected to this poison must make a <<save Con 10>>. 
** <fail><<poison 1d12>> + [[Poisoned]] for <<time 24h>></fail>
** <pass><<halved>></pass>
You and up to eight willing creatures within range project your astral bodies into the Astral Plane (the spell fails and the casting is wasted if you are already on that plane). 
The material body you leave behind is unconscious and in a state of suspended animation; it doesn’t need food or air and doesn’t age.

Your astral body resembles your mortal form in almost every way, replicating your game statistics and possessions. The principal difference is the addition of&nbsp;a silvery cord that extends from between your shoulder&nbsp;blades and trails behind you, fading to invisibility after&nbsp;1 foot. This cord is your tether to your material body. As&nbsp;long as the tether remains intact, you can find your way&nbsp;home. If the cord is cut something that can happen&nbsp;only when an effect specifically states that it does your&nbsp;soul and body are separated, killing you instantly.&nbsp;

Your astral form can freely travel through the Astral&nbsp;Plane and can pass through portals there leading to any&nbsp;other plane. If you enter a new plane or return to the&nbsp;plane you were on when casting this spell, your body and&nbsp;possessions are transported along the silver cord, allowing&nbsp;you to re-enter your body as you enter the new plane.&nbsp;Your astral form is a separate incarnation. Any damage&nbsp;or other effects that apply to it have no effect on your&nbsp;physical body, nor do they persist when you return to it.&nbsp;The spell ends for you and your companions when&nbsp;you use your action to dismiss it. When the spell ends,&nbsp;the affected creature returns to its physical body,&nbsp;and it awakens.&nbsp;

The spell might also end early for you or one of your&nbsp;companions. A successful dispel magic spell used&nbsp;against an astral or physical body ends the spell for that&nbsp;creature. If a creature’s original body or its astral form&nbsp;drops to 0 hit points, the spell ends for that creature. If&nbsp;the spell ends and the silver cord is intact, the cord pulls&nbsp;the creature’s astral form back to its body, ending its&nbsp;state of suspended animation.&nbsp;If you are returned to your body prematurely, your&nbsp;companions remain in their astral forms and must find&nbsp;their own way back to their bodies, usually by dropping&nbsp;to 0 hit points.
Whether you’re striking with a melee weapon, firing a weapon at range, or making an attack roll as part of a spell, an attack has a simple structure.

# ''Choose a target.'' Pick a target within your attack’s range: a creature, an object, or a location.
# ''Determine modifiers.'' The GM determines whether the target has cover and whether you have advantage or disadvantage against the target. In addition, spells, special abilities, and other effects can apply penalties or bonuses to your attack roll.
# ''Resolve the attack.'' You make the attack roll. On a hit, you roll damage, unless the particular attack has rules that specify otherwise. Some attacks cause special effects in addition to or instead of damage.

If there’s ever any question whether something you’re doing counts as an attack, the rule is simple: if you’re making an attack roll, you’re making an attack.

!! Additional Rules

<<htabs "[tag[Attack]sort[]]">>
|max top|k
| !Spell | !Melee | !Ranged |
|[[Acid Splash]] 60'<br/><<save Dex>> <<acid d6>>,<<per 2>> |[[Booming Blade]]<br/><<thunder d8>><<thunder d8>> |[[Chill Touch]] 120'<br/><<necrotic d8>>, <<heal no>> |
|[[Create Bonfire]] 60'<br/><<save Dex>> <<fire d8>>, ''[C]'' |[[Green-Flame Blade]]<br/><<fire d8>><<fire modifier>> |[[Eldritch Blast]] 120'<br/><<force d10>> |
|[[Frostbite]] 60'<br/><<save Con>> <<cold d6>>, //Atk disadv// |[[Primal Savagery]]<br/><<acid d10>> |[[Fire Bolt]] 120'<br/><<fire d10>> |
|[[Infestation]] 30'<br/><<save Con>><<poison d6>>, //move// <<roll d4>> |[[Shocking Grasp]]<br/>//Metal Armor: Adv//, <<lightning d8>>, //No ''[R]''// |[[Magic Stone]] 60'<br/><<bludgeoning d8+modifier>> |
|[[Lightning Lure]] 15'<br/><<save Str>>, //pull 10ft up//<<lightning d8>> |[[Thorn Whip]] 30'<br/><<piercing d6>>, //Pull 10'// |[[Produce Flame]] 30'<br/><<fire d8>> |
|[[Mind Sliver]] 60'<br/><<save Int>><<psychic 1d6>>, //<<roll -1d4>> next save// | |[[Ray of Frost]] 60'<br/><<cold d8>>, //speed -10 ft// |
|[[Poison Spray]] 10'<br/><<save Con>><<poison d12>> | | |
|[[Sacred Flame]] 60'<br/><<save Dex>><<radiant d8>> | | |
|[[Sword Burst]] <<sphere 5'>><br/><<save Dex>><<force d6>> | | |
|[[Thunderclap]] <<sphere 5'>><br/><<save Con>><<thunder d6>> | | |
|[[Toll the Dead]] 60'<br/><<save Wis>><<necrotic d8>> / <<necrotic d12>> | | |
|[[Vicious Mockery]] 60'<br/><<save Wis>><<psychic d4>>, //Atk disadv// | | |
|[[Word of Radiance]] <<sphere 5'>><br/><<save Con>><<radiant d6>> | | |
By casting gem-inlaid sticks, rolling dragon bones, laying out ornate cards, or employing some other divining tool, you receive an omen from an otherworldly entity about the results of a specific course of action that you plan to take within the next 30 minutes. The DM chooses from the following possible omens: 

* Weal, for good results 
* Woe, for bad results 
* Weal and woe, for both good and bad results 
* Nothing, for results that aren’t especially good or bad 

The spell doesn’t take into account any possible circumstances that might change the outcome, such as the casting of additional spells or the loss or gain of a companion.    If you cast the spell two or more times before completing your next long rest, there is a cumulative 25 percent chance for each casting after the first that you get a random reading. The DM makes this roll in secret.
At 18th level, the range of your auras increase to 30 feet.
Starting at 10th level, you and friendly creatures within 10 feet of you can’t be frightened while you are conscious.

At 18th level, the range of this aura increases to 30 feet.
Starting at 7th level, you and friendly creatures within 10 feet of you can’t be charmed while you are conscious.

At 18th level, the range of this aura increases to 30 feet.

Starting at 6th level, whenever you or a friendly creature within 10 feet of you must make a saving throw, the creature gains a bonus to the saving throw equal to your Charisma modifier (with a minimum bonus of +1). You must be conscious to grant this bonus.

At 18th level, the range of this aura increases to 30 feet.
| !Hit<br/>Dice | !Classes | !Per<br/>Level | !Base<br/>HP | !Hitpoints @ Level (Con +2) |<|<|<|<|
|~|~|~|~| !1 | !5 | !10 | !15 | !20 |
|^ !d12 |!Barbarian |^ 7+2 |^ 12 |^ 14 |^ 50 |^ 95 |^ 140 |^ 185 |
|^ !d10 |!Fighter<br/>Paladin<br/>Ranger |^ 6+2 |^ 10 |^ 12 |^ 44 |^ 89 |^ 134 |^ 179 |
|^ !d8 |!Bard<br/>Cleric<br/>Druid<br/>Monk<br/>Rogue<br/>Warlock |^ 5+2 |^ 8 |^ 10 |^ 38 |^ 73 |^ 108 |^ 143 |
|^ !d6 |!Sorcerer<br/>Wizard |^ 4+2 |^ 6 |^ 8 |^ 32 |^ 62 |^ 92 |^ 122 |
After spending the casting time tracing magical pathways within a precious gemstone, you touch a huge or smaller beast or plant. 
The target must have either no Intelligence score or an Intelligence of 3 or less. The target gains an Intelligence of 10. The target also gains the ability to speak one language you know. If the target is a plant, it gains the ability to move its limbs, roots, vines, creepers, and so forth, and it gains senses similar to a human’s. Your DM chooses statistics appropriate for the awakened plant, such as the statistics for the awakened shrub or the awakened tree. 

The awakened beast or plant is [[Charmed]] by you for 30 days or until you and your companions do anything harmful to it. When the [[Charmed]] condition ends, the awakened creature chooses whether to remain friendly to you, based on how you treated it while it was charmed.
"""
''False Appearance.'' While the shrub remains motionless, it is indistinguishable from a normal shrub.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Rake +1>>|<<slashing 1d4-1>> |<<reach 5>> |
"""
''False Appearance.'' While the tree remains motionless, it is indistinguishable from a normal tree.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +6>>|<<bludgeoning 3d6+4>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +4>>|<<slashing 1d8+2>> |<<reach 5>> |
"""
''Heated Body.'' A creature that touches the azer or hits it with a melee attack while within <<range 5>> of it takes <<fire 1d10>>.
''Heated Weapons.'' When the azer hits with a metal melee weapon, it deals an extra <<fire 1d6>> (included in the attack).
''Illumination.'' The azer sheds <<bright>> in a <<sphere 10>> and <<dim>> for <<sphere 20>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Warhammer +5>>|<<bludgeoning 1d8+3>><br/><<bludgeoning 1d10+3>> (''two-handed'') |<<reach 5>> |
|~|<<fire 1d6>> |<|
"""
''Pack Tactics.'' The baboon has advantage on an attack roll against a creature if at least one of the baboon's allies is within 5 feet of the creature and the ally isn't [[Incapacitated]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +1>>|<<piercing 1d4-1>> |<<reach 5>> |
Every story has a beginning. Your character’s background reveals where you came from, how you became an adventurer, and your place in the world. Your fighter might have been a courageous knight or a grizzled soldier. Your wizard could have been a
sage or an artisan. Your rogue might have gotten by as a guild thief or commanded audiences as a jester.

Choosing a background provides you with important story cues about your character’s identity. The most important question to ask about your background is what changed? Why did you stop doing whatever your background describes and start adventuring? Where did you get the money to purchase your starting gear, or, if you come from a wealthy background, why don’t you have more money? How did you learn the skills of your class? What sets you apart from ordinary people who share your background?

<div class="shadow-box" style="column-width: 11em;"><$list filter="[tag[Background]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>
"""
''Keen Smell.'' The badger has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +2>>|<<piercing 1>> |<<reach 5>> |
Inside this heavy cloth bag are <<roll 3d4>> dry beans. The bag weighs 1/2 pound plus 1/4 pound for each bean it contains.

If you dump the bag’s contents out on the ground, they explode in a <<sphere 10>>, extending from the beans. Each creature in the area, including you, must make a <<save Dex 15>>, taking <fail><<fire 5d4>></fail>, or <pass><<halved>></pass>>. The fire ignites flammable objects in the area that aren’t being worn or carried.

If you remove a bean from the bag, plant it in dirt or sand, and then water it, the bean produces an effect <<time 1m>> later from the ground where it was planted. The DM can choose an effect from the following table, determine it randomly, or create an effect.

|max top|k
| !d100 | !Effect |
| !01 |<<roll 5d4>> toadstools sprout. If a creature eats a toadstool, roll any die. On an odd roll, the eater must succeed on a <<save Con 15>> or take <fail><<poison 5d6>></fail> and become [[Poisoned]] for <<time 1h>>. On an even roll, the eater gains 5d6 temporary hit points for <<time 1h>>. |
| !02–10 |A geyser erupts and spouts water, beer, berry juice, tea, vinegar, wine, or oil (DM’s choice) 30 feet into the air for <<roll 1d12>> rounds. |
| !11–20 |A <<mob Treant>> sprouts (see the Monster Manual for statistics). There’s a 50 percent chance that the treant is chaotic evil and attacks. |
| !21–30 |An animate, immobile stone statue in your likeness rises. It makes verbal threats against you. If you leave it and others come near, it describes you as the most heinous of villains and directs the newcomers to find and attack you. If you are on the same plane of existence as the statue, it knows where you are. The statue becomes inanimate after <<time 24h>>. |
| !31–40 |A campfire with blue flames springs forth and burns for <<time 24h>> (or until it is extinguished). |
| !41–50 |<<roll 1d6+6>> <<mob Shrieker>> sprout (see the Monster Manual for statistics). |
| !51–60 |<<roll 1d4+8>> bright pink toads crawl forth. Whenever a <<mob Toad>> is touched, it transforms into a Large or smaller monster of the DM’s choice. The monster remains for <<time 1m>>, then disappears in a puff of bright pink smoke. |
| !61–70 |A hungry <<mob Bulette>> (see the Monster Manual for statistics) burrows up and attacks. |
| !71–80 |A fruit tree grows. It has <<roll 1d10+20>> fruit, <<roll 1d8>> of which act as randomly determined magic potions, while one acts as an ingested poison of the DM’s choice. The tree vanishes after <<time 1h>>. Picked fruit remains, retaining any magic for <<time 30d>>. |
| !81–90 |A nest of <<roll 1d4+3>> eggs springs up. Any creature that eats an egg must make a <<save Con 20>>. On a successful save, a creature permanently increases its lowest ability score by 1, randomly choosing among equally low scores. On a failed save, the creature takes <<force 10d6>> from an internal magical explosion. |
| !91–99 |A pyramid with a <<square 60>> base bursts upward. Inside is a sarcophagus containing a <<mob "Mummy Lord">> (see the Monster Manual for statistics). The pyramid is treated as the mummy lord’s lair, and its sarcophagus contains treasure of the DM’s choice. |
| !00 |A giant beanstalk sprouts, growing to a height of the DM’s choice. The top leads where the DM chooses, such as to a great view, a cloud giant’s castle, or a different plane of existence. |
This bag superficially resembles a bag of holding but is a feeding orifice for a gigantic extradimensional creature. Turning the bag inside out closes the orifice.

The extradimensional creature attached to the bag can sense whatever is placed inside the bag. Animal or vegetable matter placed wholly in the bag is devoured and lost forever. When part of a living creature is placed in the bag, as happens when someone reaches inside it, there is a 50 percent chance that the creature is pulled inside the bag. A creature inside the bag can use its action to try to escape with a successful <<save Str 15>>. Another creature can use its action to reach into the bag to pull a creature out, doing so with a successful <<save Str 20>> (provided it isn’t pulled inside the bag first). Any creature that starts its turn inside the bag is devoured, its body destroyed.

Inanimate objects can be stored in the bag, which can hold a cubic foot of such material. However, once each day, the bag swallows any objects inside it and spits them out into another plane of existence. The DM determines the time and plane.

If the bag is pierced or torn, it is destroyed, and anything contained within it is transported to a random location on the Astral Plane.
This ordinary bag, made from [[Gray|Bag of Tricks, Gray]], [[Rust|Bag of Tricks, Rust]], or [[Tan|Bag of Tricks, Tan]] cloth, appears empty. Reaching inside the bag , however, reveals the presence of a small, fuzzy object. The bag weighs 1/2 pound.

You can use an action to pull the fuzzy object from the bag and throw it up to 20 feet. When the object lands, it transforms into a creature you determine by rolling a <<roll d8>> and consulting the table that corresponds to the bag’s color. See the Monster Manual for the creature’s statistics. The creature vanishes at the next dawn or when it is reduced to <<hp 0>>.

The creature is friendly to you and your companions, and it acts on your turn. You can use a bonus action to command how the creature moves and what action it takes on its next turn, or to give it general orders, such as to attack your enemies. In the absence of such orders, the creature acts in a fashion appropriate to its nature.

Once three fuzzy objects have been pulled from the bag, the bag can’t be used again until the next dawn.
{{Bag of Tricks}}

| !d8 | !Creature | !CR |
| !1 |<<mob Weasel>> | {{Weasel!!cr}} |
| !2 |<<mob "Giant Rat">> | {{Giant Rat!!cr}} |
| !3 |<<mob Badger>> | {{Badger!!cr}} |
| !4 |<<mob Boar>> | {{Boar!!cr}} |
| !5 |<<mob Panther>> | {{Panther!!cr}} |
| !6 |<<mob "Giant Badger">> | {{Giant Badger!!cr}} |
| !7 |<<mob "Dire Wolf">> | {{Dire Wolf!!cr}} |
| !8 |<<mob "Giant Elk">> | {{Giant Elk!!cr}} |

{{Bag of Tricks}}

| !d8 | !Creature | !CR |
| !1 |<<mob Rat>> | {{Rat!!cr}} |
| !2 |<<mob Owl>> | {{Owl!!cr}} |
| !3 |<<mob Mastiff>> | {{Mastiff!!cr}} |
| !4 |<<mob Goat>> | {{Goat!!cr}} |
| !5 |<<mob "Giant Goat">> | {{Giant Goat!!cr}} |
| !6 |<<mob "Giant Boar">> | {{Giant Boar!!cr}} |
| !7 |<<mob Lion>> | {{Lion!!cr}} |
| !8 |<<mob "Brown Bear">> | {{Brown Bear!!cr}} |
{{Bag of Tricks}}

| !d8 | !Creature | !CR |
| !1 |<<mob Jackal>> | {{Jackal!!cr}} |
| !2 |<<mob Ape>> | {{Ape!!cr}} |
| !3 |<<mob Baboon>> | {{Baboon!!cr}} |
| !4 |<<mob "Axe Beak">> | {{Axe Beak!!cr}} |
| !5 |<<mob "Black Bear">> | {{Black Bear!!cr}} |
| !6 |<<mob "Giant Weasel">> | {{Giant Weasel!!cr}} |
| !7 |<<mob "Giant Hyena">> | {{Giant Hyena!!cr}} |
| !8 |<<mob Tiger>> | {{Tiger!!cr}} |
"""
''Death Throes.'' When the balor dies, it explodes, and each creature within <<range 30>> of it must make a <<save Dex 20>>, taking <<fire 20d6>> on a failed save, or <<halved>> on a successful one. The explosion ignites flammable objects in that area that aren’t being worn or carried, and it destroys the balor’s weapons.
''Fire Aura.'' At the start of each of the balor’s turns, each creature within <<range 5>> of it takes <<fire 3d6>>, and flammable objects in the aura that aren’t being worn or carried ignite. A creature that touches the balor or hits it with a melee attack while within <<range 5>> of it takes <<fire 3d6>>.
''Magic Resistance.'' The balor has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The balor’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The balor makes two attacks: one with its longsword and one with its whip.


|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +14>>|<<slashing 3d8+8>> + <<lightning 3d8>> |<<reach 10>> |
|~|If the balor scores a critical hit, it rolls damage dice three times, instead of twice. |<|
| !<<melee Whip +14>>|<<slashing 2d6+8>> + <<fire 3d6>> |<<reach 30>> |
|~|Target must succeed on a <<save Str 20>> or be pulled up to <<range 25>> toward the balor. |<|
| !Teleport|The balor magically teleports, along with any equipment it is wearing or carrying, up to <<range 120>> to an unoccupied space it can see. |<|
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +3>>|<<slashing 1d6+1>> |<<reach 5>> |
| !<<ranged "Light Crossbow" +3>>|<<piercing 1d8+1>> |<<range 80/320>> |
''Multiattack.'' The captain makes three melee attacks: two with its scimitar and one with its dagger. Or the captain makes two ranged attacks with its daggers.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +5>>|<<slashing 1d6+3>> |<<reach 5>> |
| !<<melee Dagger +5>>|<<piercing 1d4+3>> |<<reach 5>><br/><<range 20/60>> |
| !<<reaction>> Reactions |<|<|
| !Parry|The captain adds <<ac +2>> against one melee attack that would hit it. To do so, the captain must see the attacker and be wielding a melee weapon. |<|
Up to three creatures of your choice that you can see within range must make Charisma saving throws. Whenever a target that fails this saving throw makes an attack roll or a saving throw before the spell ends, the target must roll a d4 and subtract the number rolled from the attack roll or saving throw.
You attempt to send one creature that you can see within range to another place of existence. The target must succeed on a Charisma saving throw or be banished. 

If the target is native to the plane of existence you’re on, you banish the target to a harmless demiplane. While there, the target is [[Incapacitated]]. The target remains there until the spell ends, at which point the target reappears in the space it left or in the nearest unoccupied space if that space is occupied. 

If the target is native to a different plane of existence that the one you’re on, the target is banished with a faint popping noise, returning to its home plane. 
If the spell ends before 1 minute has passed, the target reappears in the space it left or in the nearest unoccupied space if that space is occupied. Otherwise, the target doesn’t return.
As a barbarian, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d12 per barbarian level
''Hit Points at 1st Level:'' 12 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d12 (or 7) + your Constitution modifier per barbarian level after 1st
"""

!!! Proficiencies

"""
''Armor:'' Light armor, medium armor, shields
''Weapons:'' Simple weapons, martial weapons
''Tools:'' None
''Saving Throws:'' Strength, Constitution
''Skills:'' Choose two from Animal Handling, Athletics, Intimidation, Nature, Perception, and Survival
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a greataxe or (b) any martial melee weapon
(a) two handaxes or (b) any simple weapon
An explorer’s pack and four javelins
"""

!!! Subclasses

<<list-box "[tag[Barbarian]tag[Subclass]sort[]]">>

!!! Advancement Table

{{||BarbarianAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<vtabs "[[Rage]] [[Barbarian Unarmored Defense]] [[Reckless Attack]] [[Danger Sense]] [[Primal Path]] [[Primal Knowledge]] [[Barbarian Ability Score Improvement]] [[Barbarian Extra Attack]] [[Fast Movement]] [[Feral Instinct]] [[Instinctive Pounce]] [[Brutal Critical]] [[Relentless Rage]] [[Brutal Critical]] [[Persistent Rage]] [[Brutal Critical]] [[Indomitable Might]] [[Primal Champion]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Barbarian Ability Score Improvement}}
{{Barbarian Ability Score Improvement}}
{{Barbarian Ability Score Improvement}}
{{Barbarian Ability Score Improvement}}
Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.
While you are not wearing any armor, your Armor Class equals 10 + your Dexterity modifier + your Constitution modifier. You can use a shield and still gain this benefit.

R0lGODlhAAEAAaEBAAAAAP///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu95sAIMVgMIBsPJe9Z3Sxvd623cR5HDunD/N3K//41yeVpydEKBhFWBikiOjUmATpGCkJWDlZp6hmqYn5prmZBrrouTNK+nNayqjKCbrqcxr62QqbIzubKWt7izvmy2uDm7s3HEwzDEdrfAyTrKyb3PzyTMxxGFKNOj2ivX2BDeLNveL9TdH5YU6eYn4+ke7hzn4yr365YU9P4v4eEX+t374SAgMCzNAP2kBxBRHWwpBQ4cJ7+sA9tBDRzsT+bAkt7sKYUeNGhg0lPKsQMtzIDiH/jYOQEt9KDSkfrHMQ8+BMmjkZ3FSQ8+JOm0E/GvgZoCiwoTCVPkTqVCjTBVFHIYBaVefUMFnj6ev6aqtPsJAKkpUpNunZtVnTUmULV6lbrnHr9px71K7elnjV7v1b0S3gwS/nEj5cDS/ixUvTMn4cVjDkySIdU76s+DLlzJohG+682TJoz6JHM5Zs+nTp1IdRs269+vVezrLt9s1bO+7tA7nZ7qbbu+tv4MHP/i7+1zVy3bGXr1Xu/Hnz6GChU68+/XpV69q3Z+8ulzv4oLTHOy1vvij69HfFs8+4/j1f9/JLfq9f+DP++fr+90fc7d9/AAZoX38EanOcbi3VNZxV4fn1lW8NlgVfAx3h5F2ClV3YFFIYqjecX8QhCE9+HcYU4lFveXjiSei0l+KILqKUGEg1xSijNB7paGOFOPIWWIkz0ujjjxCSCBGPOxYYY5A9WpUPh0Yy+SRaRDqZIpZVqsQTizhqeaVWS9ZoJG5IRgmlQWeWeSQzLEmVJJlsmqkkmpGpWeeccuJp5ZhwlrmnnWLG6eacV+XZ5Z18pmnooYUuGsibjzZKJ6OQVnYpl5RWOiihnfrZp6GNSapophJt6mipgoa6ZaSoAmWpqf6YFOurOVqT6Ket4mprqq7KyhGrvbbJq6fCvqj+6bAr/rpqsrmequyy0D7rrEPMRivtrC7V+iy2QhYLKqZ4eousti0e+y25V5KkqrXmqjutsdV6pG6S7Or6Yr32UtTuvvpidC+6//xbg1EEP/Lnwa7gq7AhCTccDcMQp/LwxKxwa7HDBmcccb8c87DmxyCbKLIOXpaMQ8gom4zoyr1M6vLLo8Ys88Y0p9zyzcjkrLMMQ/YsDM9AOzPz0DvbbPQMMCcdw9JMU1P001AjLbULTlddTtRYZ0311ipc7XU9WoctdtdkmwD22d2MrfbaZrctQtpw84vx3MFWbDepdectD9t8ywru380KLHiYHhdOLeGI0/r24uFe67i7e0e7brjElJ9r+eUf4q055op3DmvjoBMl+ugW+m366aWnHjrnrN8K+euquy47p5+zLnftQK6ue+66E3t76r73jvrvwM9r/O601z4888X/3rzs0b8+Pe7PE8+789lLf732y3O/PfXdg/+9+OFbf77w45tfPvrtq5++6dXD/77867s/efLz2x//6Pv7fz/65c94/wNdATt3QM0lkHI/Sx7skOfA470Le8HznrgieCIManCDHOygBz8IwhCKMAcFAAA7
|top|k
| !Level | !Proficiency Bonus | !Features | !Rage | !Rage Damage |
| !1 | +2 |<<list-abilities 1>> | 2 | +2 |
| !2 | +2 |<<list-abilities 2>> | 2 | +2 |
| !3 | +2 |<<list-abilities 3>> | 3 | +2 |
| !4 | +2 |<<list-abilities 4>> | 3 | +2 |
| !5 | +3 |<<list-abilities 5>> | 3 | +2 |
| !6 | +3 |<<list-abilities 6>> | 4 | +2 |
| !7 | +3 |<<list-abilities 7>> | 4 | +2 |
| !8 | +3 |<<list-abilities 8>> | 4 | +2 |
| !9 | +4 |<<list-abilities 9>> | 4 | +3 |
| !10 | +4 |<<list-abilities 10>> | 4 | +3 |
| !11 | +4 |<<list-abilities 11>> | 4 | +3 |
| !12 | +4 |<<list-abilities 12>> | 5 | +3 |
| !13 | +5 |<<list-abilities 13>> | 5 | +3 |
| !14 | +5 |<<list-abilities 14>> | 5 | +3 |
| !15 | +5 |<<list-abilities 15>> | 5 | +3 |
| !16 | +5 |<<list-abilities 16>> | 5 | +4 |
| !17 | +6 |<<list-abilities 17>> | 6 | +4 |
| !18 | +6 |<<list-abilities 18>> | 6 | +4 |
| !19 | +6 |<<list-abilities 19>> | 6 | +4 |
| !20 | +6 |<<list-abilities 20>> | Unlimited | +4 |
"""
''Barbed Hide.'' At the start of each of its turns, the barbed devil deals 5 (1d10) piercing damage to any creature grappling it.
''Devil's Sight.'' Magical darkness doesn't impede the devil's darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes three melee attacks: one with its tail and two with its claws. Alternatively, it can use Hurl Flame twice.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +6>>|<<piercing 1d6+3>> |<<reach 5>> |
| !<<melee Tail +6>>|<<piercing 2d6+3>> |<<reach 5>> |
| !<<ranged "Hurl Flame" +5>>|<<fire 3d6>> |<<range 150>> |
|~|If the target is a flammable object that isn't being worn or carried, it also catches fire. |<|
As a bard, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d8 per bard level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per bard level after 1st
"""

!!! Proficiencies

"""
''Armor:'' Light armor
''Weapons:'' Simple weapons, hand crossbows, longswords, rapiers, shortswords
''Tools:'' Three musical instruments of your choice
''Saving Throws:'' Dexterity, Charisma
''Skills:'' Choose any three
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a rapier, (b) a longsword, or (c) any simple weapon
(a) a diplomat’s pack or (b) an entertainer’s pack
(a) a lute or (b) any other musical instrument
Leather armor and a dagger
"""

!!! Subclasses

<<list-box "[tag[Bard]tag[Subclass]sort[]]">>

!!! Advancement Table
{{||BardAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Bard Spellcasting]] [[Bardic Inspiration]] [[Jack of All Trades]] [[Song of Rest]] [[Magical Inspiration]] [[Bard College]] [[Bard Expertise]] [[Bard Ability Score Improvement]] [[Bardic Versatility]] [[Font of Inspiration]] [[Countercharm]] [[Magical Secrets]] [[Superior Inspiration]]">>

When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Bard Ability Score Improvement}}
{{Bard Ability Score Improvement}}
{{Bard Ability Score Improvement}}
{{Bard Ability Score Improvement}}
<<spelltable "[[Blade Ward]] [[Dancing Lights]] [[Friends]] [[Light]] [[Mage Hand]] [[Mending]] [[Message]] [[Minor Illusion]] [[Prestidigitation]] [[Thunderclap]] [[True Strike]] [[Vicious Mockery]]">>
At 3rd level, you delve into the advanced techniques of a bard college of your choice: 

<<list-links "[tag[Bard]tag[Subclass]sort[]]">>

Your choice grants you features at 3rd level and again at 6th and 14th level.
At 3rd level, choose two of your skill proficiencies. Your proficiency bonus is doubled for any ability check you make that uses either of the chosen proficiencies.

At 10th level, choose two more of your skill proficiencies. Your proficiency bonus is doubled for any ability check you make that uses either of the chosen proficiencies.
You have learned to untangle and reshape the fabric of reality in harmony with your wishes and music. Your spells are part of your vast repertoire, magic that you can tune to different situations. See Spells Rules for the general rules of spellcasting and the Spells Listing for the bard spell list.

!!! Cantrips

You know two cantrips of your choice from the bard spell list. You learn additional bard cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Bard table.

!!! Spell Slots

The Bard table shows how many spell slots you have to cast your bard spells of 1st level and higher. To cast one of these spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

For example, if you know the 1st-level spell cure wounds and have a 1st-level and a 2nd-level spell slot available, you can cast cure wounds using either slot.

!!! Spells Known of 1st Level and Higher

You know four 1st-level spells of your choice from the bard spell list.

The Spells Known column of the Bard table shows when you learn more bard spells of your choice. Each of these spells must be of a level for which you have spell slots, as shown on the table. For instance, when you reach 3rd level in this class, you can learn one new spell of 1st or 2nd level.

Additionally, when you gain a level in this class, you can choose one of the bard spells you know and replace it with another spell from the bard spell list, which also must be of a level for which you have spell slots.

!!! Spellcasting Ability

''Charisma'' is your spellcasting ability for your bard spells. Your magic comes from the heart and soul you pour into the performance of your music or oration. You use your Charisma whenever a spell refers to your spellcasting ability. In addition, you use your Charisma modifier when setting the saving throw DC for a bard spell you cast and when making an attack roll with one.

''Spell save DC'' = 8 + your proficiency bonus + your Charisma modifier

''Spell attack modifier'' = your proficiency bonus + your Charisma modifier

!!! Ritual Casting

You can cast any bard spell you know as a ritual if that spell has the ritual tag.

!!! Spellcasting Focus

You can use a musical instrument (see the Tools section) as a spellcasting focus for your bard spells.
<<htabs "[tag[Bard Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqnKoAVQM1qF9eudQuWesffsFlJTp/XxbSbDf+55/F6bo6361/YA55uULY3SFL2B3hFqBhy2Oi1COmR6EgWKBiJiWFI2WWZ+anpx5kIWkpxGTBKKmraqqBK6SprCXs4K7ta2+d5i7ubCouA2jtbS3wcSKvqh+yLpcvbbKr7Jj1N/Wh9DRwMrN36bJz67bxMPi3a7X0Oia3GvuheCR/fR81NX6+8PJxPeO/vE7SAoMQRzKTuIMJRCktxaugwFsSCjSZG/GPxWp7+jBQBcRS48ePCkCLbYSwZyRZKkyRXDlLp8t/JmC9n0tQD86adnDrj8OzJ5ifQM0KHhilqdAvSpFmWMp3i9GmUqFKfUK3a5CpWNFq3IqnotWnXsG3Gkh0C9uxUs2qBpG3rxBFcq2/ncmVrV4fcvEv28k3i9++RwILL4i1MgzBiIYoXu63r+PHhyHwgU+7R+PKOzJrvWO7seTLoFJxH1yhtegbq1DAkssbh+rWN2LITr669gjbuGLp3V/7sm0Xv4MJvEy8x/Dhp48pFJG9u4iH04synd5BufXn17Bqwc4/+/Luk8OI5eC/vnDz6DOfXf2jv/rr6+BXg0+8+/74E+/r+L/DvX19+ADrw34D7CWggFwgmKEyBDDbA0IMWRCjhKQ5WmACFGEag4YYPdOghhCCGmKE5JDJg0IkNpqgiNiquOFCL8sg444nyrLLhjZ3kqCOOEva4449ABpngkNkwaOSRAyY5hoFMNrnkk0rSJ+U891UJJZVYZunellyi5+WX5YUp5ndkTmnmmUSKpyaa1rXp5nRwxtncnGvKaaePeObZj3J86unnn30SJyighBb6S6CIJnooQCU6ehykKMYYKYsEWrobppeaGJymH3LqW0IBjigbqKNe2JmoE1biUaZ0vMMeq63W9qqVsZKa2hvVbKArrLSqMasmvZaZK7C74mf+LLGmDWvrrahGpuqqtSoLWrSnJktntdZO4Gmq3UJAKWuSWritt9+KGO6y43K4rrbYBrspRvC6Ow9wj9oyr2byliZdvpedpKE5LY2m0pb7+EpwwVIejDC9Gz3JcMPmKjxkxBLrK1HF3NgLLXY3prMdXybWaOrEGbto8bHqUuhoySafLE65/44cs8sv71WzzRgL3M25HfMMNK47R5iz0DMH3a/OQ7tmkNJHwwolQFn6u7SSR7ZMpMriInyJOw3em+3Nhm7cLtlhVz1lkmCfLfainS5KbbFwj7313Iy6OnedCyrIcakh8y3azzY5O3ClgZuttaKFS7u44Y2T+3ijdo4mySeYk68Hp35kOlmlhx+/uHbioI9Oeummn4566qqvznrrrr9OUAEAOw==
|max top|k
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !Spells Known | !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 |<<list-abilities 1>> | 2 | 4 | 2 | - | - | - | - | - | - | - | - |
| !2nd | +2 |<<list-abilities 2>>  | 2 | 5 | 3 | - | - | - | - | - | - | - | - |
| !3rd | +2 |<<list-abilities 3>> | 2 | 6 | 4 | 2 | - | - | - | - | - | - | - |
| !4th | +2 |<<list-abilities 4>> | 3 | 7 | 4 | 3 | - | - | - | - | - | - | - |
| !5th | +3 |<<list-abilities 5>> | 3 | 8 | 4 | 3 | 2 | - | - | - | - | - | - |
| !6th | +3 |<<list-abilities 6>> | 3 | 9 | 4 | 3 | 3 | - | - | - | - | - | - |
| !7th | +3 |<<list-abilities 7>> | 3 | 10 | 4 | 3 | 3 | 1 | - | - | - | - | - |
| !8th | +3 |<<list-abilities 8>> | 3 | 11 | 4 | 3 | 3 | 2 | - | - | - | - | - |
| !9th | +4 |<<list-abilities 9>> | 3 | 12 | 4 | 3 | 3 | 3 | 1 | - | - | - | - |
| !10th | +4 |<<list-abilities 10>> | 4 | 14 | 4 | 3 | 3 | 3 | 2 | - | - | - | - |
| !11th | +4 |<<list-abilities 11>> | 4 | 15 | 4 | 3 | 3 | 3 | 2 | 1 | - | - | - |
| !12th | +4 |<<list-abilities 12>> | 4 | 15 | 4 | 3 | 3 | 3 | 2 | 1 | - | - | - |
| !13th | +5 |<<list-abilities 13>> | 4 | 16 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | - | - |
| !14th | +5 |<<list-abilities 14>> | 4 | 18 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | - | - |
| !15th | +5 |<<list-abilities 15>> | 4 | 19 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | - |
| !16th | +5 |<<list-abilities 16>> | 4 | 19 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | - |
| !17th | +6 |<<list-abilities 17>> | 4 | 20 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 |<<list-abilities 18>> | 4 | 22 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 |<<list-abilities 19>> | 4 | 22 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 |<<list-abilities 20>> | 4 | 22 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
You can inspire others through stirring words or music. To do so, you use a bonus action on your turn to choose one creature other than yourself within 60 feet of you who can hear you. That creature gains one Bardic Inspiration die, a d6.

Once within the next 10 minutes, the creature can roll the die and add the number rolled to one ability check, attack roll, or saving throw it makes. The creature can wait until after it rolls the d20 before deciding to use the Bardic Inspiration die, but must decide before the DM says whether the roll succeeds or fails. Once the Bardic Inspiration die is rolled, it is lost. A creature can have only one Bardic Inspiration die at a time.

You can use this feature a number of times equal to your Charisma modifier (a minimum of once). You regain any expended uses when you finish a long rest.

Your Bardic Inspiration die changes when you reach certain levels in this class. The die becomes a d8 at 5th level, a d10 at 10th level, and a d12 at 15th level.

---

!!! Extended Uses of Bardic Inspiration 

<<vtabs "[tag[Bardic Inspiration]sort[]]">>
{{Bardic Inspiration}}
{{Bardic Inspiration}}
{{Bardic Inspiration}}
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can do one of the following, representing a change in focus as you use your skills and magic:

* Replace one of the skills you chose for the Expertise feature with one of your other skill proficiencies that isn’t benefiting from Expertise.
* Replace one cantrip you learned from this class’s Spellcasting feature with another cantrip from the bard spell list.
You touch a willing creature. Until the spellends, the target’s skin has a rough, bark-like appearance, and the target’s AC can’t be less than 16, regardless of what kind of armor it is wearing.
\define test()
<$transclude field="label" />
\end

\define hover(tiddler)
<$hover popup="$:/state/$tiddler$">[[$tiddler$]]</$hover><$reveal type="popup" state="$:/state/$tiddler$"><div class="tc-drop-down" style="max-width: 500px; padding: 7px; white-space: normal;"><$transclude tiddler="$tiddler$" mode="block" /></div></$reveal>
\end

\define include(tiddler)
!! <$link to="$tiddler$"><$transclude tiddler="$tiddler$" field="caption"><$view tiddler="$tiddler$" field="title" /></$transclude></$link>
{{$tiddler$}}
\end

\define h3(tiddler)
!!! <$link to="$tiddler$"><$transclude tiddler="$tiddler$" field="caption"><$view tiddler="$tiddler$" field="title" /></$transclude></$link>

<$transclude tiddler="$tiddler$" mode=block />
\end

\define p(tiddler)
<p>''<$link to="$tiddler$"><$transclude tiddler="$tiddler$" field="caption"><$view tiddler="$tiddler$" field="title" /></$transclude></$link>.'' <$transclude tiddler="$tiddler$" mode=inline /> </p>
\end

\define list-icons(tiddlers, emptyMessage)
<div class="gallery"><$list filter="$tiddlers$" emptyMessage="$emptyMessage$">{{||LogoTemplate}}</$list></div>
\end

\define list-box(tiddlers, emptyMessage)
<div class="shadow-box" style="column-width: 200px;"><$list filter="$tiddlers$" emptyMessage="$emptyMessage$"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>
\end

\define list-abilities(level)
<$set name=label value={{!!label}}><div><$list filter="[all[current]get[class]] +[tagging[]tag[Ability]!tag[Optional]level[$level$]first[]]">{{||Link}}</$list><$list filter="[all[current]get[class]] +[tagging[]tag[Ability]!tag[Optional]level[$level$]butfirst[]]">, {{||Link}}</$list></div><div><$list filter="[all[current]get[class]] +[tagging[]tag[Ability]tag[Optional]level[$level$]first[]]">''[Optional]'' {{||Link}}</$list><$list filter="[all[current]get[class]] +[tagging[]tag[Ability]tag[Optional]level[$level$]butfirst[]]">, {{||Link}}</$list></div><div><$list filter="[all[current]get[subclass]] +[tagging[]tag[Ability]level[$level$]first[]]">''[<<label>>]'' {{||Link}}</$list><$list filter="[all[current]get[subclass]] +[tagging[]tag[Ability]level[$level$]butfirst[]]">, {{||Link}}</$list></div></$set>
\end

\define htabs(tiddlers)
<$macrocall $name="tabs" tabsList="$tiddlers$" state="$:/state/tab<<hash $tiddlers$>>"/>
<hr/>
//Quick Links:// <<links "$tiddlers$">>
\end

\define sections(tiddlers, default)
<$macrocall $name="tabs" tabsList="$tiddlers$" state="$:/state/tab<<hash $tiddlers$>>" default="$default$"/>
<hr/>
//Quick Links:// <<links "$tiddlers$">>
\end

\define vtabs(tiddlers, default)
<$macrocall $name="tabs" tabsList="$tiddlers$" class="tc-vertical" state="$:/state/tab<<hash $tiddlers$>>" default="$default$"/>
<hr/>
//Quick Links:// <<links "$tiddlers$">>
\end

\define sections-vertical(tiddlers)
<$macrocall $name="tabs" tabsList="$tiddlers$" class="tc-vertical" state="$:/state/tab<<hash $tiddlers$>>"/>
<hr/>
//Quick Links:// <<links "$tiddlers$">>
\end

\define link(tiddler)
{{$tiddler$||Link}}
\end

\define links(tiddlers)
<$list filter="$tiddlers$">| {{||Link}} </$list> |
\end

\define p2(tiddlers)
<$list filter="$tiddlers$">{{||P2Template}} </$list>
\end

\define p3(tiddlers)
<$list filter="$tiddlers$">{{||P3Template}} </$list>
\end

\define imageuri(title)
<$macrocall $name="makedatauri" type={{$title$!!type}} text={{$title$}}/>
\end

\define snippet(tiddler)
<span class="padding">

{{$tiddler$}}
</span>
\end


"""
''&lt;&lt;include'' //tiddler//''&gt;&gt;'' - Include a tiddler as a chapter
''&lt;&lt;list-icons'' //tiddler emptyMessage//''&gt;&gt;'' - List tiddlers as a grid of icons
''&lt;&lt;list-box'' //tiddler emptyMessage//''&gt;&gt;'' - List tiddlers as a grid of links
''&lt;&lt;list-abilities'' //classes level//''&gt;&gt;'' - List class-level abilities as a comma delimited list
''&lt;&lt;htabs'' //tiddler//''&gt;&gt;'' - List tiddlers in a tab panel
''&lt;&lt;vtabs'' //tiddler//''&gt;&gt;'' - List tiddlers in a vertical tab panel
''&lt;&lt;link'' //tiddler//''&gt;&gt;'' - Link to a tiddler, using it's caption if it exists
''&lt;&lt;links'' //tiddlers//''&gt;&gt;'' - Link to a list of tiddlers, using their captions if it exists
''&lt;&lt;p'' //tiddler//''&gt;&gt;'' - Include a tiddler as a paragraph
''&lt;&lt;p2'' //tiddlers//''&gt;&gt;'' - List tiddlers as a series of paragraphs
''&lt;&lt;p3'' //tiddlers//''&gt;&gt;'' - List tiddlers as a series of paragraphs
''&lt;&lt;imageuri'' //tiddler//''&gt;&gt;'' - URI of image tiddler

//Old Macros - To be deprecated//
''&lt;&lt;h3'' //tiddler//''&gt;&gt;'' - Include a tiddler as a third level chapter
''&lt;&lt;hover'' //tiddler//''&gt;&gt;'' - Popup tiddler's content
''&lt;&lt;snippet'' //title// //tiddler//''&gt;&gt;'' - Include tiddler as a floating snippet
"""
"""
''Petrifying Gaze.'' If a creature starts its turn within <<range 30>> of the basilisk and the two of them can see each other, the basilisk can force the creature to make a <<save Con 12>> if the basilisk isn’t [[Incapacitated]]. On a failed save, the creature magically begins to turn to stone and is [[Restrained]]. It must repeat the saving throw at the end of its next turn. On a success, the effect ends. On a failure, the creature is petrified until freed by the greater restoration spell or other magic.

A creature that isn’t surprised can avert its eyes to avoid the saving throw at the start of its turn. If it does so, it can’t see the basilisk until the start of its next turn, when it can avert its eyes again. If it looks at the basilisk in the meantime, it must immediately make the save.

If the basilisk sees its reflection within <<range 30>> of it in bright light, it mistakes itself for a rival and targets itself with its gaze.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 2d6+3>> + <<poison 2d6>> |<<reach 5>> |
"""
''Echolocation.'' The bat can't use its [[Blindsight]] while [[Deafened]].
''Keen Hearing.'' The bat has advantage on Wisdom (Perception) checks that rely on hearing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +0>>|<<piercing 1>> |<<reach 5>> |
This spell bestows hope and vitality. Choose any number of creatures within range. For the duration, each target has advantage on Wisdom saving throws and death saving throws, and regains the maximum number of hit points possible from any healing.
This small black sphere measures 3/4 of an inch in diameter and weighs an ounce. Typically, <<roll 1d4+4>> beads of force are found together.

You can use an action to throw the bead up to <<range 60>>. The bead explodes on impact and is destroyed. Each creature within a <<sphere 10>> of where the bead landed must succeed on a <<save Dex 15>> or take <fail><<force 5d4>></fail>. A sphere of transparent force then encloses the area for <<time 1m>>. Any creature that failed the save and is completely within the area is trapped inside this sphere. Creatures that succeeded on the save, or are partially within the area, are pushed away from the center of the sphere until they are no longer inside it. Only breathable air can pass through the sphere’s wall. No attack or other effect can.

An enclosed creature can use its action to push against the sphere’s wall, moving the sphere up to half the creature’s walking speed. The sphere can be picked up, and its magic causes it to weigh only 1 pound, regardless of the weight of creatures inside.
"""
''Devil's Sight.'' Magical darkness doesn't impede the devil's darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
''Steadfast.'' The devil can't be [[Frightened]] while it can see an allied creature within 30 feet of it.
"""
<<divider>>
''Multiattack.'' The devil makes two attacks: one with its beard and one with its glaive.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beard +5>>|<<piercing 1d8+2>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 12>> or be [[Poisoned]] for <<time 1m>>. While [[Poisoned]] in this way, the target can't regain <<hp>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
| !<<melee Glaive +5>>|<<slashing 1d10+3>> |<<reach 10>> |
|~|If the target is a creature other than an undead or a construct, it must succeed on a <<save Con 12>> or lose <<damage 1d10>> at the start of each of its turns due to an infernal wound. Each time the devil hits the wounded target with this attack, the damage dealt by the wound increases by <<damage 1d10>>. Any creature can take an action to stanch the wound with a successful <<medicine 12>>. The wound also closes if the target receives magical healing. |<|
Beasts are nonhumanoid creatures that are a natural part of the fantasy ecology. Some of them have magical powers, but most are unintelligent and lack any society or language . Beasts include all varieties of ordinary animals, dinosaurs, and giant versions of animals.

<<list-box "[tag[Beast]sort[]]" "No beasts found.">>

You can cast speak with animals at will, without expending a spell slot.
Beginning at 18th level, you can cast many of your druid spells in any shape you assume using [[Wild Shape]]. You can perform the somatic and verbal components of a druid spell while in a beast shape, but you aren’t able to provide material components.

You gain proficiency in the Deception and Persuasion skills.
''Multiattack.'' The behir makes two attacks: one with its bite and one to constrict.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +10>>|<<piercing 3d10+6>> |<<reach 10>> |
| !<<melee Constrict +10>>|<<bludgeoning 2d10+6>> + <<slashing 2d10+6>> |<<reach 5>> |
|~|The target is [[Grappled]], <<save Escape 16>> if the behir isn’t already constricting a creature, and the target is restrained until this grapple ends. |<|
| !Lightning Breath|''Recharge on 5–6''<br/>The behir exhales a line of lightning that is 20 feet long and 5 feet wide. Each creature in that line must make a <<save Dex 16>>, taking <<lightning 12d10>> on a failed save, or <<halved>> on a successful one. |<|
| !Swallow|The behir makes one bite attack against a Medium or smaller target it is grappling. If the attack hits, the target is also swallowed, and the grapple ends. While swallowed, the target is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the behir, and it takes <<acid 6d6>> damage at the start of each of the behir’s turns. A behir can have only one creature swallowed at a time.<br/>&nbsp;<br/>If the behir takes <<damage "&ge;30">>  on a single turn from the swallowed creature, the behir must succeed on a <<save Con 14>> at the end of that turn or regurgitate the creature, which falls [[Prone]] in a space within <<range 10>> of the behir. If the behir dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse by using 15 feet of movement, exiting [[Prone]]. |<|
{{Belt of Giant Strength}}
While wearing this belt, you gain the following benefits:

* Your Constitution score increases by 2, to a maximum of 20.
* You have advantage on Charisma (Persuasion) checks made to interact with dwarves.

In addition, while attuned to the belt, you have a 50 percent chance each day at dawn of growing a full beard if you’re capable of growing one, or a visibly thicker beard if you already have one.

If you aren’t a dwarf, you gain the following additional benefits while wearing the belt:

* You have advantage on saving throws against poison, and you have resistance against poison damage.
* You have darkvision out to a range of 60 feet.
* You can speak, read, and write Dwarvish.
{{Belt of Giant Strength}}
{{Belt of Giant Strength}}
While wearing this belt, your Strength score changes to a score granted by the belt. The item has no effect on you if your Strength without the belt is equal to or greater than the belt’s score.

Six varieties of this belt exist, corresponding with and having rarity according to the six kinds of true giants. The [[Belt of Stone Giant Strength]] and the [[Belt of Frost Giant Strength]] look different, but they have the same effect.

| !Type | !Strength | !Rarity |
|!Hill giant | 21 |Rare |
|!Stone/frost giant | 23 |Very rare |
|!Fire giant | 25 |Very rare |
|!Cloud giant | 27 | Legendary |
|!Storm giant | 29 | Legendary |
{{Belt of Giant Strength}}
{{Belt of Giant Strength}}
{{Belt of Giant Strength}}
"""
''Reckless.'' At the start of its turn, the berserker can gain advantage on all melee weapon attack rolls during that turn, but attack rolls against it have advantage until the start of its next turn.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greataxe +5>>|<<slashing 1d12+3>> |<<reach 5>> |
You gain a +1 bonus to attack and damage rolls made with this magic weapon. In addition, while you are attuned to this weapon, your hit point maximum increases by 1 for each level you have attained.

''Curse.'' This axe is cursed, and becoming attuned to it extends the curse to you. As long as you remain cursed, you are unwilling to part with the axe, keeping it within reach at all times. You also have disadvantage on attack rolls with weapons other than this one, unless no foe is within 60 feet of you that you can see or hear.

Whenever a hostile creature damages you while the axe is in your possession, you must succeed on a <<save Wis 15>> or go berserk. While berserk, you must use your action each round to attack the creature nearest to you with the axe. If you can make extra attacks as part of the Attack action, you use those extra attacks, moving to attack the next nearest creature after you fell your current target. If you have multiple possible targets, you attack one at random. You are berserk until you start your turn with no creatures within 60 feet of you that you can see or hear.
You touch a creature, and that creature must succeed on a Wisdom saving throw or become cursed for the duration of the spell. When you cast this spell, choose the nature of the curse from the following options:

* Choose one ability score. While cursed, the target has disadvantage on ability checks and saving throws made with that ability score.
* While cursed, the target has disadvantage on attack rolls against you.
* While cursed, the target must make a Wisdom saving throw at the start of each of its turns. If it fails, it wastes its action that turn doing nothing.
* While the target is cursed, your attacks and spells deal an extra 1d8 necrotic damage to the target.

A [[Remove Curse]] spell ends this effect. At the DM's option, you may choose an alternative curse effect, but it should be no more powerful than those described above. The DM has final say on such a curse's effect.
''Prerequisite:'' 7th level

You can cast compulsion once using a warlock spell slot. You can’t do so again until you finish a long rest.

"""
''Keen Smell.'' The bear has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack.'' The bear makes two attacks, one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<melee Claw +4>>|<<slashing 2d4+2>> |<<reach 5>> |
"""
''Amphibious.'' The dragon can breathe air and water.
"""
<<divider>>
''Multiattack.'' The dragon makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d10+2>>+<<acid 1d4>> |<<reach 5>> |
| !Acid Breath|''Recharge on 5–6''<br/>The dragon exhales acid in a 15-foot line that is 5 feet wide. Each creature in that line must make a <<save Dex 11>>, taking <<acid 5d8>> on a failed save, or <<halved>> on a successful one. |<|
"""
''Amorphous.'' The pudding can move through a space as narrow as 1 inch wide without squeezing.
''Corrosive Form.'' A creature that touches the pudding or hits it with a melee attack while within 5 feet of it takes <<acid 1d8>>. Any nonmagical weapon made of metal or wood that hits the pudding corrodes. After dealing damage, the weapon takes a permanent and cumulative −1 penalty to damage rolls. If its penalty drops to −5, the weapon is destroyed. Nonmagical ammunition made of metal or wood that hits the pudding is destroyed after dealing damage.

The pudding can eat through 2-inch-thick, nonmagical wood or metal in 1 round.
''Spider Climb.'' The pudding can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pseudopod +5>>|<<bludgeoning 1d6+3>> + <<acid 4d8>> |<<reach 5>> |
|~|Nonmagical armor worn by the target is partly dissolved and takes a permanent and cumulative −1 penalty to the AC it offers. The armor is destroyed if the penalty reduces its <<ac 10>>. |<|
| !<<reaction>> Reactions |<|<|
| !Split|When a pudding that is Medium or larger is subjected to lightning or slashing damage, it splits into two new puddings if it has at least <<hp 10>>. Each new pudding has hit points equal to half the original pudding’s, rounded down. New puddings are one size smaller than the original pudding. |<|
Squirming, ebony tentacles fill a 20-foot square on ground that you can see within range. For the duration, these tentacles turn the ground in the area into difficult terrain. 

When a creature enters the affected area for the first time on a turn or starts its turn there, the creature must succeed on a Dexterity saving throw or take 3d6 bludgeoning damage and be [[Restrained]] by the tentacles until the spell ends. A creature that starts its turn in the area and is already restrained by the tentacles takes 3d6 bludgeoning damage. 

A creature [[Restrained]] by the tentacles can use its action to make a Strength or Dexterity check (its choice) against your spell save DC. On a success, it frees itself.
You create a vertical wall of whirling, razor-sharp blades made of magical energy. The wall appears within range and lasts for the duration. You can make a straight wall up to 100 feet long, 20 feet high, and 5 feet thick, or a ringed wall up to 60 feet in diameter, 20 feet high, and 5 feet thick. The wall provides three-quarters cover to creatures behind it, and its space is difficult terrain. 

&nbsp;When a creature enters the wall’s area for the first time on a turn or starts its turn there, the creature must make a Dexterity saving throw. On a failed save, the creature takes 6 d10 slashing damage. On a successful save, the creature takes half as much damage.
You bless up to three creatures of your choice within range. Whenever a target makes an attack roll or a saving throw before the spell ends, the target can roll a d4 and add the number rolled to the attack roll or saving throw.&nbsp;
Beginning at 6th level, the healing spells you cast on others heal you as well. When you cast a spell of 1st level or higher that restores hit points to a creature other than you, you regain hit points equal to 2 + the spell’s level.

"""
''Replaces the Divine Strike or Potent Spellcasting feature''
"""

You are blessed with divine might in battle. When a creature takes damage from one of your cantrips or weapon attacks, you can also deal 1d8 radiant damage to that creature. Once you deal this damage, you can’t use this feature again until the start of your next turn.
A character might receive a blessing from a deity for doing something truly momentous-an accomplishment that catches the attention of both gods and mortals. 

A character retains the benefits of a blessing forever or until it is taken away by the god who granted it. Unlike a magic item, such a blessing can't be suppressed by an anti magic field or similar effect.


<<sections-vertical "[tag[Blessing]sort[]]">>
Necromantic energy washes over a creature of your choice that you can see within range, draining moisture and vitality from it. The target must make a Constitution saving throw. The target takes 8d8 necrotic damage on a failed save, or half as much damage on a successful one. This spell has no effect on undead or constructs.

If you target a plant creature or a magical plant, it makes the saving throw with disadvantage, and the spell deals maximum damage to it.

If you target a nonmagical plant that isn't a creature, such as a tree or shrub, it doesn't make a saving throw; it simply withers and dies.
* A blinded creature can't see and automatically fails any ability check that requires sight.
* Attack rolls against the creature have advantage, and the creature's attack rolls have disadvantage.
You can blind or deafen a foe. Choose one creature that you can see within range to make a Constitution saving throw. If it fails, the target is either [[Blinded]] or [[Deafened]] (your choice) for the duration. At the end of each of its turns, the target can make a Constitution saving throw. On a success, the spell ends.&nbsp;
Starting at 14th level, if you are able to hear, you are aware of the location of any hidden or invisible creature within 10 feet of you.
A creature with blindsight can perceive its surroundings without relying on sight, within a specific radius. Creatures without eyes, such as oozes, and creatures with echolocation or heightened senses, such as bats and true dragons, have this sense.
Roll a d20 at the end of each of your turns for the duration of the spell. On a roll of 11 or higher, you vanish from your current plane of existence and appear in the Etheral Plane (the spell fails and the casting is wasted if you were already on that plane). 

At the start of you next turn, and when the spell ends if you are on the Etheral Plane, you return to an unoccupied space of your choice that you can see within 10 feet of the space you vanished from. If no unoccupied space is available within that rang, you appear in the nearest unoccupied space (chosen at random if more that one space is equally near). You can dismiss this spell as an action. 

While on the Ethereal Plane, you can see and hear the plane you originated from, which is cast in shades of gray, and you can’t see anything more than 60 feet away.You can only affect and be affected by other reatures on the Ethereal Plane. Creature that aren’t there can’t perceive you or interact with you, unless they have the ability to do so.
"""
''Keen Hearing and Smell.'' The dog has advantage on Wisdom (Perception) checks that rely on hearing or smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d6+1>> |<<reach 5>> |
| !Teleport|''Recharge 4–6.''<br/>The dog magically teleports, along with any equipment it is wearing or carrying, up to <<range 40>> to an unoccupied space it can see. Before or after teleporting, the dog can make one bite attack. |<|
"""
''Keen Sight.'' The hawk has advantage on Wisdom (Perception) checks that rely on sight.
''Pack Tactics.'' The hawk has advantage on an attack roll against a creature if at least one of the hawk's allies is within 5 feet of the creature and the ally isn't incapacitated.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +4>>|<<piercing 1d4+2>> |<<reach 5>> |
Your body becomes blurred, shifting and wavering to all who can see you. For the duration, any creature has disadvantage on attack rolls against you. An attacker is immune to this effect if it doesnt rely on sight, as with [[Blindsight]], or can see through illusions, as with [[Truesight]].
"""
''Charge.'' If the boar moves at least 20 feet straight toward a target and then hits it with a tusk attack on the same turn, the target takes an extra <<slashing 1d6>>. If the target is a creature, it must succeed on a <<save Str 11>> or be knocked prone.
''Relentless (Recharges after a Short or Long Rest).'' If the boar takes <<damage "&le;7">> that would reduce it to <<hp 0>>, it is reduced to <<hp 1>> instead.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Tusk +3>>|<<slashing 1d6+1>> |<<reach 5>> |
"""
''Devil’s Sight.'' Magical darkness doesn’t impede the devil’s darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes three attacks: two with its claws and one with its sting.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +8>>|<<slashing 1d8+4>> |<<reach 10>> |
| !<<melee Sting +8>>|<<piercing 2d8+4>>+<<poison 5d6>> |<<reach 10>> |
|~|Target must succeed on a <<save Con 14>> or become [[Poisoned]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
''Prerequisite:'' Pact of the Tome feature

You can now inscribe magical rituals in your Book of Shadows. Choose two 1st-level spells that have the ritual tag from any class’s spell list (the two needn’t be from the same list). The spells appear in the book and don’t count against the number of spells you know. With your Book of Shadows in hand, you can cast the chosen spells as rituals. You can’t cast the spells except as rituals, unless you’ve learned them by some other means. You can also cast a warlock spell you know as a ritual if it has the ritual tag.

On your adventures, you can add other ritual spells to your Book of Shadows. When you find such a spell, you can add it to the book if the spell’s level is equal to or less than half your warlock level (rounded up) and if you can spare the time to transcribe the spell. For each level of the spell, the transcription process takes 2 hours and costs 50 gp for the rare inks needed to inscribe it.

R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0PF5i02ouz3rznCIbiSJbm+XjqyrauhcbyTNfSi+f6bvf+79sJh8QO8IhMNorMpnOijEptz6pVN81qRdeut7UNiw/fstk4TkfP7DZMDf+55+64fUbP1+/8kf7P1icIAVhoNoioYLj4lejICNnliBhZ+TQpaKnZhHnH1NnzCZpGNHpUahomlJq0yprF86oUK9uaUzuFhXuKs5vb6xsEHLw2TIz3cvzroozM3CxlDE2SPB39bE0Nln3Nwu2H/Y1ULU64XW7rjZ6ivp6u4r50Hg8UTm8wfy/Xrh+Q30+Fn75/AGkQjCewYEB4AA8qlOGwXMSHJyZ+s0hR24r+hgkzxsCYDaRHECKnlRzJbmO/kyjlqRzYsaVGhjBfyqwYEx3Lmwl2HvPJE19OiUODpqR5D2hQpb6Y3nSKC2pLqbKojrTKCmtGraa4PvQKCmxBsZjIrix6Ea1RBmYfqV2r6K21tknlmrQLV6hNenT54m3WF+FfZYHdFe5zWOfgn4uNJvbUeGnkppOfVo56eWrmqpuvds76eWvorqO/lg57emzqsqvP7hX8Ou9RDxxjy3aJ1K/t2zd2E/XNG8FjO8PTAjeeOzjb1m6PKy8OB3pI5omkz6VOCTvs5Ia1d3c+HTxv62PIQzOvyvs69FvYMxZ/F75s97DUK5YP2P5v7uv+9Yujvwx/ygnnXxwAUoYfYQVyc2AxCa7V4CwLhifgfrQN6ECE71yI4XIPEqMhZx8GE+IrJdYz4XUjIlghhifus6JlMWI2o2Y1itjigC8Kc6NnPYL2o2hBkjakaUWidqRqSbK2pGs5MphifE9SyGGHcTXZ3JTjRSnGjqN4uZCWt4FZA5lMinkel/lhWZ2aCrKZHZzbVakbmnmZ6YydcOEJkZvv6fknnVaS4Wd9cn4HKIiFkrhoN4lKdihije7C50eT0vgoi4IO6s+lG6LBKYGR8lFpnJlS6imOm/Y3qoWg1tXqf6nyEityq953qkyl4lQrlL2qsWsms6L4q4q51hL+rKTFljdsKsnOdGuHz4KzbJrVpnftm8eq+mqonWarxbTENcvjtj6aCyS6QqpLJLtGuoskvErKe2a0LpIbCr7x2mtrt6GKGwLA0elbJsH1+osov88ZnKfCwQkcAcSkMNwnuIpaHKDDW2LsqMZjUmwpx6iKLCHJyIKMgsTMmjwOyoOonOGwUOyLMKv0NkzBwRzUdnPKG0wCM24ehzu0oT23ifGiQXt4NLUWL91b0wGTAxnLtEod8S2kumwCeq6MazWxWMf89cBhwzg202VPfHa5RaONCrBclyBdFWanXTXehNrNtt4GFuhF328HWrODknQ5N7SFf3oF4m3nO2ob2Pr+fffgPktO9ONhWt41HZlTLrecfxjNuaaLQ6712i1rXjCbZasudukj96w67G6f3u/OjB9k++a4+0pv799qfbXsmBovNNVqK4868tzqDjfzy9vjO/Swuiv8lcQ3/zuV3TstTda6cG99nc7vvT0XtLQOuuDfk7S+4tSH3P7K5mYvfvr0n5+u8/jDP76K1c9xx/rf1AJ4uQFOzngGVB8CO8c6g1SmgeCTXgXLN6f3RS181WMK1LTHOQpCUH8OVGB7GiNCXpEQgCb83OBSmEAO5o9/zhoMDPdnwdlocE12uqEAZUi2FpJOgz7E2fyCSMN2eayIEnwgEneoLY0xkX1ABCH+FAmHwel5LX7Jy6LNFDbF2x2xJ4m74M90OMbQrVBUQszY6cJYvBzqpY0dWxwcV7fG4SXxSzm54+76WMYSrsqPJVvhB8kYG0IajoOHZKOgFFlH6jUSfXSCpBvtMck5VsmSQwxHJvUIKk66kByf3IYoT6iLUnrjlAtMhioPIaVGOClw3mvcLG0JvMPVRJe5u8QtfYkrK/CMbwkD5vWMWUxO/LIIw1TmLp25zCE0M27zEsUzqakQZGaQlf2TZjSrOE0nfpGLHrHmMcVZTmxuU47p5CbS0GkjeMpKnvEEZy8jqEZ23nOPwXxlGvdkz1zic2v/3KcGvKVPgV6RJwU16BsovKVJLybzAxB15BmrSdGKWhQD6+KoRq34UIpk9KMbzJmuZkbSlAiiAAA7
While you wear these boots, your steps make no sound, regardless of the surface you are moving across. You also have advantage on Dexterity (Stealth) checks that rely on moving silently.
While you wear these boots, you can use an action to cast the [[Levitate]] spell on yourself at will.
While you wear these boots, you can use a bonus action and click the boots’ heels together. If you do, the boots double your walking speed, and any creature that makes an opportunity attack against you has disadvantage on the attack roll. If you click your heels together again, you end the effect.

When the boots’ property has been used for a total of <<time 10m>>, the magic ceases to function until you finish a long rest.
While you wear these boots, your walking speed becomes 30 feet, unless your walking speed is higher, and your speed isn’t reduced if you are encumbered or wearing heavy armor. In addition, you can jump three times the normal distance, though you can’t jump farther than your remaining movement would allow.
These furred boots are snug and feel quite warm. While you wear them, you gain the following benefits:

* You have resistance to <<cold cold>> damage.
* You ignore difficult terrain created by ice or snow.
* You can tolerate temperatures as low as −50 degrees Fahrenheit without any additional protection. If you wear heavy clothes, you can tolerate temperatures as low as −100 degrees Fahrenheit.
While this bowl is filled with water, you can use an action to speak the bowl’s command word and summon a water elemental, as if you had cast the [[Conjure Elemental]] spell. The bowl can’t be used this way again until the next dawn.

The bowl is about 1 foot in diameter and half as deep. It weighs 3 pounds and holds about 3 gallons.
While wearing these bracers, you have proficiency with the longbow and shortbow, and you gain a +2 bonus to damage rolls on ranged attacks made with such weapons.
While wearing these bracers, you gain a +2 bonus to AC if you are wearing no armor and using no shield.
The next time you hit a creature with a weapon attack before this spell ends, the weapon gleams with astral radiance as you strike. The attack deals an extra 2d6 radiant damage to the target, which becomes visible if it is [[Invisible]], and the target sheds dim light in a 5-foot radius and can’t become invisible until the spell ends. 
You have advantage on saving throws against being frightened.
While a fire burns in this brass brazier, you can use an action to speak the brazier’s command word and summon a fire elemental, as if you had cast the [[Conjure Elemental]] spell. The brazier can’t be used this way again until the next dawn.

The brazier weighs 5 pounds.
You can use your action to exhale destructive energy. Your draconic ancestry determines the size, shape, and damage type of the exhalation. When you use your breath weapon, each creature in the area of the exhalation must make a saving throw, the type of which is determined by your draconic ancestry. The DC for this saving throw equals 8 + your Constitution modifier + your proficiency bonus. A creature takes 2d6 damage on a failed save, and half as much damage on a successful one. The damage increases to 3d6 at 6th level, 4d6 at 11th level, and 5d6 at 16th level. After you use your breath weapon, you can’t use it again until you complete a short or long rest.
Brewing is the art of producing beer. Not only does beer serve as an alcoholic beverage, but the process of brewing purifies water. Crafting beer takes weeks of fermentation, but only a few hours of work.

''Components.'' Brewer’s supplies include:

* a large glass jug
* a quantity of hops
* a siphon
* several feet of tubing.

''History.'' Proficiency with brewer’s supplies gives you additional insight on Intelligence (History) checks concerning events that involve alcohol as a significant element.

''Medicine.'' This tool proficiency grants additional insight when you treat anyone suffering from alcohol poisoning or when you can use alcohol to dull pain.

''Persuasion.'' A stiff drink can help soften the hardest heart. Your proficiency with brewer’s supplies can help you ply someone with drink, giving them just enough alcohol to mellow their mood.

''Potable Water.'' Your knowledge of brewing enables you to purify water that would otherwise be undrinkable. As part of a long rest, you can purify up to 6 gallons of water, or 1 gallon as part of a short rest.

| !Activity | !DC |
|!Detect poison or impurities in a drink | 10 |
|!Identify alcohol | 15 |
|!Ignore effects of alcohol | 20 |
While wearing this brooch, you have resistance to <<force force>> damage, and you have immunity to damage from the [[Magic Missile]] spell.
This wooden broom, which weighs 3 pounds, functions like a mundane broom until you stand astride it and speak its command word. It then hovers beneath you and can be ridden in the air. It has a flying speed of 50 feet. It can carry up to 400 pounds, but its flying speed becomes 30 feet while carrying over 200 pounds. The broom stops hovering when you land.

You can send the broom to travel alone to a destination within 1 mile of you if you speak the command word, name the location, and are familiar with that place. The broom comes back to you when you speak another command word, provided that the broom is still within 1 mile of you.
"""
''Keen Smell.'' The bear has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack.'' The bear makes two attacks, one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1d8+4>> |<<reach 5>> |
| !<<melee Claw +6>>|<<slashing 2d6+4>> |<<reach 5>> |
Beginning at 9th level, you can roll one additional weapon damage die when determining the extra damage for a critical hit with a melee attack.

This increases to two additional dice at 13th level and three additional dice at 17th level.
{{Brutal Critical}}
{{Brutal Critical}}
"""
''Brute.'' A melee weapon deals one extra die of its damage when the bugbear hits with it (included in the attack).
''Surprise Attack.'' If the bugbear surprises a creature and hits it with an attack during the first round of combat, the target takes an extra <<damage 2d6>> from the attack.
"""
[img[divider.png]]

|max|k
| !<<action>> Actions |<|<|
| !<<melee Morningstar +4>>|<<piercing 2d8+2>> |<<reach 5>> |
| !<<melee Javelin +4>>|<<piercing 2d6+2>> |<<reach 5>> |
| !<<ranged Javelin +4>>|<<piercing 1d6+2>> |<<range 30/120>> |
''Standing Leap.'' The bulette’s long jump is up to 30 feet and its high jump is up to 15 feet, with or without a running start.
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 4d12+4>> |<<reach 5>> |
| !Deadly Leap|If the bulette jumps at least 15 feet as part of its movement, it can then use this action to land on its feet in a space that contains one or more other creatures. Each of those creatures must succeed on a <<save "Str/Dex" 16>> (target’s choice) or be knocked [[Prone]] and take <<bludgeoning 3d6+4>> + <<slashing 3d6+4>>. On a successful save, the creature takes only <<halved>>, isn’t knocked [[Prone]], and is pushed 5 feet out of the bulette’s space into an unoccupied space of the creature’s choice. If no unoccupied space is within range, the creature instead falls [[Prone]] in the bulette’s space. |<|
"""
''Price:'' 16 gp
1 Backpack
Bag of 1,000 Ball Bearings
10 feel of String
1 Bell
5 Candles
1 Crowbar
1 Hammer
10 Pitons
1 Hooded Lantern
2 Flasks of Oil
5 days Ralions
1 Tinderbox
1 Walerskin
50 feel of Hempen Rope
"""
As you hold your hands with thumbs touching and fingers spread, a thin sheet of flames shoots forth from your outstretched fingertips. Each creature in a 15-foot cone must make a Dexterity saving throw. A creature takes 3d6 fire damage on a failed save, or half as much damage on a successful one. 

The fire ignites any flammable objects in the area that aren’t being worn or carried.&nbsp;
"""
''Price per Dose:'' 500 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 13>> or take <<poison 3d6>>, and must repeat the saving throw at the start of each of its turns. 
* On each successive failed save, the character takes <<poison 1d6>>.
* After three successful saves, the poison ends.
A monster that has a burrowing speed can use that speed to move through sand, earth, mud, or ice . A monster can't burrow through solid rock unless it has a special trait that allows it to do so.
This disease targets humanoids, although gnomes are strangely immune. While in the grips of this disease, victims frequently succumb to fits of mad laughter, giving the disease its common name and its morbid nickname: &quot;the shrieks.&quot;

!! Symptoms

Symptoms manifest <<time "1d4 hours">> after infection and include fever and disorientation. The infected creature gains one level of [[Exhaustion]] that can’t be
removed until the disease is cured.

* ''On suffering great stress.''
** Entering combat
** Taking damage
** Experiencing fear
** Having a nightmare
** <<save Con 13>>
*** <fail><<psychic 1d10>> + [[Incapacitated]] with mad laughter for <<time 1m>></fail>
*** Creature can repeat saving throw at end of each of its turn, ending the mad laughter and [[Incapacitated]] condition on a success.
* ''End of Long Rest.''
** <<save Con 13>>
*** <pass>DC for this save, and for avoiding an attack of mad laughter is reduced by <<roll 1d6>></pass>
*** When DC drops to 0, creature recovers from the disease. 
*** ''Three failures.'' Creature gains a randomly determined [[Indefinite Madness]]

!! Infection

* ''On starting turn within 10 feet of an infected creature in the throws of mad laughter.''
** <<save Con 10>> 
*** <fail>Infected with Cackle Fever</fail>
*** <pass>Immune to mad laughter of that particular infected creature for <<time 24h>></pass>
A storm cloud appears in the shape of a cylinder that is 10 feet tall with a 60-foot radius, centered on a point you can see within range directly above you. The spell fails if you can't see a point in the air where the storm cloud could appear (for example, if you are in a room that can't accommodate the cloud).

When you cast the spell, choose a point you can see under the cloud. A bolt of lightning flashes down from the cloud to that point. Each creature within 5 feet of that point must make a Dexterity saving throw. A creature takes 3d10 lightning damage on a failed save, or half as much damage on a successful one. On each of your turns until the spell ends, you can use your action to call down lightning in this way again, targeting the same point or a different one.

If you are outdoors in stormy conditions when you cast this spell, the spell gives you control over the existing storm instead of creating a new one. Under such conditions, the spell's damage increases by 1d10.
Calligraphy treats writing as a delicate, beautiful art. Calligraphers produce text that is pleasing to the eye, using a style that is difficult to forge. Their supplies also give them some ability to examine scripts and determine if they are legitimate, since a calligrapher’s training involves long hours of studying writing and attempting to replicate its style and design.

''Components.'' Calligrapher’s supplies include:

* ink
* a dozen sheets of parchment
* three quills.

''Arcana.'' Although calligraphy is of little help in deciphering the content of magical writings, proficiency with these supplies can aid in identifying who wrote a script of a magical nature.

''History.'' This tool proficiency can augment the benefit of successful checks made to analyze or investigate ancient writings, scrolls, or other texts, including runes etched in stone or messages in frescoes or other displays.

''Decipher Treasure Map.'' This tool proficiency grants you expertise in examining maps. You can make an Intelligence check to determine a map’s age, whether a map includes any hidden messages, or similar facts.

| !Activity | !DC |
|!Identify writer of nonmagical script | 10 |
|!Determine writer’s state of mind | 15 |
|!Spot forged text | 15 |
|!Forge a signature | 20 |
You attempt to suppress strong emotions in a group of people. 
Each humanoid in a 20-foot-radius sphere centered on a point you choose within range must make a Charisma saving throw; a creature can choose to fail this saving throw if it wishes. If a creature fails its saving throw, choose one of the following two effects. You can suppress any effect causing a target to be [[Charmed]] or [[Frightened]]. When this spell ends, any suppressed effect resumes, provided that its duration has not expired in the meantime. 

Alternatively, you can make a target indifferent about creatures of your choice that it is hostile toward. This indifference ends if the target is attacked or harmed by a spell or if it witnesses any of its friends being harmed. When the spell ends, the creature becomes hostile again, unless the DM rules otherwise.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<bludgeoning 1d4>> |<<reach 5>> |
This slender taper is dedicated to a deity and shares that deity’s alignment. The candle’s alignment can be detected with the [[Detect Evil and Good]] spell. The DM chooses the god and associated alignment or determines the alignment randomly.

| !d20 | !Alignment |
| !1-2 |Chaotic evil |
| !3-4 |Chaotic neutral |
| !5-7 |Chaotic good |
| !8-9 |Neutral evil |
| !10-11 |Neutral |
| !12-13 |Neutral good |
| !14-15 |Lawful evil |
| !16-17 |Lawful neutral |
| !18-20 |Lawful good |
 
The candle’s magic is activated when the candle is lit, which requires an action. After burning for <<time 4h>>, the candle is destroyed. You can snuff it out early for use at a later time. Deduct the time it burned in increments of <<time 1m>> from the candle’s total burn time.

While lit, the candle sheds <<dim 30>>. Any creature within that light whose alignment matches that of the candle makes attack rolls, saving throws, and ability checks with advantage. In addition, a cleric or druid in the light whose alignment matches the candle’s can cast 1st-level spells he or she has prepared without expending spell slots, though the spell’s effect is as if cast with a 1st-level slot.

Alternatively, when you light the candle for the first time, you can cast the [[Gate]] spell with it. Doing so destroys the candle.
<<spelltable "[all[shadows+tiddlers]tag[Spell]level[0]sort[]]">>
"""
''Optional Class Feature''
"""

You have scribed a set of arcane formulas in your spellbook that you can use to formulate a cantrip in your mind. Whenever you finish a long rest and consult those formulas in your spellbook, you can replace one wizard cantrip you know with another cantrip from the wizard spell list.
This cape smells faintly of brimstone. While wearing it, you can use it to cast the [[Dimension Door]] spell as an action. This property of the cape can’t be used again until the next dawn.

When you disappear, you leave behind a cloud of smoke, and you appear in a similar cloud of smoke at your destination. The smoke lightly obscures the space you left and the space you appear in, and it dissipates at the end of your next turn. A light or stronger wind disperses the smoke.
When you cast a spell that forces other creatures to make a saving throw, you can protect some of those creatures from the spell’s full force. To do so, you spend 1 sorcery point and choose a number of those creatures up to your Charisma modifier (minimum of one creature). A chosen creature automatically succeeds on its saving throw against the spell.
Skill at carpentry enables a character to construct wooden structures. A carpenter can build a house, a shack, a wooden cabinet, or similar items.

''Components.'' Carpenter’s tools include:

* a saw
* a hammer
* nails
* a hatchet
* a square
* a ruler
* an adze
* a plane
* a chisel

''History.'' This tool proficiency aids you in identifying the use and the origin of wooden buildings and other large wooden objects.

''Investigation.'' You gain additional insight when inspecting areas within wooden structures, because you know tricks of construction that can conceal areas from discovery.

''Perception.'' You can spot irregularities in wooden walls or floors, making it easier to find trap doors and secret passages.

''Stealth.'' You can quickly assess the weak spots in a wooden floor, making it easier to avoid the places that creak and groan when they’re stepped on.

''Fortify.'' With 1 minute of work and raw materials, you can make a door or window harder to force open. Increase the DC needed to open it by 5.

''Temporary Shelter.'' As part of a long rest, you can construct a lean-to or a similar shelter to keep your group dry and in the shade for the duration of the rest. Because it was fashioned quickly from whatever wood was available, the shelter collapses 1d3 days after being assembled.

| !Activity | !DC |
|!Build a simple wooden structure | 10 |
|!Design a complex wooden structure | 15 |
|!Find a weak point in a wooden wall | 15 |
|!Pry apart a door | 20 |
You can speak the carpet's command word as an action to make the carpet hover and fly. It moves according to your spoken directions, provided that you are within 30 feet of it.

Four sizes of [[Carpet of Flying]] exist. The DM chooses the size of a given carpet or determines it randomly.

| !d100 | !Size | !Capacity | !Flying Speed |
| !01-20 |3 ft. x 5 ft. | 200 lb. | 80 feet |
| !21-55 |4 ft. x 6 ft. | 400 lb. | 60 feet |
| !56-80 |5 ft. x 7 ft. | 600 lb. | 40 feet |
| !81-100 |6 ft. x 9 ft. | 800 lb. | 30 feet |

A carpet can carry up to twice the weight shown on the table, but it flies at half speed if it carries more than its normal capacity.
"""
''Carrying Capacity = 15 x Strength (lbs)''
''Push/Drag/Lift Capacity = 30 x Strength (lbs)''
"""

| !Creature Size | !Carry/Push/Drag/Lift Multiplier |
| !Tiny | 0.5 |
| !Small | &mdash; |
| !Medium | &mdash; |
| !Large | 2 |
| !Huge | 4 |
| !Gargantuan | 8 |

---

''Carrying Capacity.'' Your carrying capacity is your Strength score multiplied by 15. This is the weight (in pounds) that you can carry, which is high enough that most characters don't usually have to worry about it.

''Push, Drag, or Lift.'' You can push, drag, or lift a weight in pounds up to twice your carrying capacity (or 30 times your Strength score). While pushing or dragging weight in excess of your carrying capacity, your speed drops lo 5 feet.

''Size and Strength.'' Larger creatures can bear more weight, whereas Tiny creatures can carry less. For each size category above Medium, double the creature's carrying capacity and the amount it can push, drag, or lift. For a Tiny creature, halve these weights.
Using cartographer’s tools, you can create accurate maps to make travel easier for yourself and those who come after you. These maps can range from large-scale depictions of mountain ranges to diagrams that show the layout of a dungeon level.

''Components.'' Cartographer’s tools consist of:

* a quill
* ink
* parchment
* a pair of compasses
* calipers
* a ruler.

''Arcana, History, Religion.'' You can use your knowledge of maps and locations to unearth more detailed information when you use these skills. For instance, you might spot hidden messages in a map, identify when the map was made to determine if geographical features have changed since then, and so forth.

''Nature.'' Your familiarity with physical geography makes it easier for you to answer questions or solve issues relating to the terrain around you.

''Survival.'' Your understanding of geography makes it easier to find paths to civilization, to predict areas where villages or towns might be found, and to avoid becoming lost. You have studied so many maps that common patterns, such as how trade routes evolve and where settlements arise in relation to geographic locations, are familiar to you.

''Craft a Map.'' While traveling, you can draw a map as you go in addition to engaging in other activity.

| !Activity | !DC |
|!Determine a map’s age and origin | 10 |
|!Estimate direction and distance to a landmark | 15 |
|!Discern that a map is fake | 15 |
|!Fill in a missing part of a map | 20 |


"""
''Keen Smell.'' The cat has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +0>>|<<slashing 1>> |<<reach 5>> |
\define subclasses(class)
<h2>Subclasses</h2>

<ul>
<li>''Player Handbook''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[PHB]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Xanathar's Guide to Everything''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[XGE]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Tasha's Cauldron of Everything''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[TCE]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Sword Coast Adventurers Guide''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[SCAG]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Eberron: Rising from The Last War''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[Eberron]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Explorer's Guide to Wildemount''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[WGE]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Guildmaster's Guide to Ravnica''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[GGR]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Mythic Odysseys of Theros''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[MOT]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Non-AL Legal''</li>
  <ul>
    <$list filter="[tag[$class$]tag[Subclass]tag[Non-AL]sort[title]]" emptyMessage="<li>No subclasses</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
</ul>
\end

\define subraces(race)
<h2>Subraces</h2>

<ul>
<li>''Player Handbook''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[PHB]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Xanathar's Guide to Everything''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[XGE]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Tasha's Cauldron of Everything''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[TCE]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Elemental Evil Players Guide''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[EEPC]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Sword Coast Adventurer's Guide''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[SCAG]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Eberron: Rising from the Last War''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[Eberron]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Explorer's Guide to Wildemount''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[WGE]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Volo's Guide to Monsters''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[Volo]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Mordenkainen's Tome of Foes''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[MToF]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
<li>''Non-AL Legal''</li>
  <ul>
    <$list filter="[tag[$race$]tag[Subrace]tag[Non-AL]sort[title]]" emptyMessage="<li>No subraces</li>">
      <li><$link to=<<currentTiddler>> ><<currentTiddler>></$link></li>
    </$list>
  </ul>
</ul>
\end

"""
''&lt;&lt;subclasses'' //class//''&gt;&gt;'' - List subclasses, grouped by source manual
''&lt;&lt;subraces'' //race//''&gt;&gt;'' - List subraces, grouped by source manual
"""
"""
''Keen Smell.'' The bear has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack.'' The bear makes two attacks, one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 1d8+5>> |<<reach 5>> |
| !<<melee Claw +7>>|<<slashing 2d6+5>> |<<reach 5>> |
Some bears have adapted to life underground, feeding on subterranean lichen and blind fish. Known as cave bears, these ill-tempered behemoths have coarse, dark hair and darkvision out to a range of 60 feet. Otherwise, they have the same statistics as a polar bear.
Celestials are creatures native to the Upper Planes. Many of them are the servants of deities, employed as messengers or agents in the mortal realm and throughout the planes. Celestials are good by nature, so the exceptional celestial who strays from a good alignment is a horrifying rarity. Celestials include angels, couatls, and pegasi.

<<list-box "[tag[Celestial]sort[]]" "No celestials found.">>
While incense is burning in this censer, you can use an action to speak the censer’s command word and summon an air elemental, as if you had cast the [[Conjure Elemental]] spell. The censer can’t be used this way again until the next dawn.

This 6-inch-wide, 1-foot-high vessel resembles a chalice with a decorated lid. It weighs 1 pound.
"""
''Charge.'' If the centaur moves at least 30 feet straight toward a target and then hits it with a ''pike'' attack on the same turn, the target takes an extra <<piercing 3d6>>.
"""
<<divider>>
''Multiattack.'' The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pike +6>>|<<piercing 1d10+4>> |<<reach 10>> |
| !<<melee Hooves +6>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
| !<<ranged +4>>|<<piercing 1d8+2>> |<<range 150/600>> |
"""
''Devil’s Sight.'' Magical darkness doesn’t impede the devil’s darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes two attacks with its chains.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Chain +8>>|<<slashing 2d6+4>> |<<reach 10>> |
|~|The target is [[Grappled]], <<skillcheck "Escape DC 14>> if the devil isn’t already grappling a creature. Until this grapple ends, the target is [[Restrained]] and takes <<piercing 2d6>> at the start of each of its turns. |<|
| !Animate Chains|''Recharges after a Short or Long Rest''<br/>Up to four chains the devil can see within 60 feet of it magically sprout razor-edged barbs and animate under the devil’s control, provided that the chains aren’t being worn or carried.<br/>&nbsp;<br/>Each animated chain is an object with <<ac 20>>, <<hp 20>>, resistance to <<piercing>>piercing damage, and immunity to <<psychic>>psychic and <<thunder>>thunder damage. When the devil uses ''Multiattack'' on its turn, it can use each animated chain to make one additional chain attack. An animated chain can grapple one creature of its own but can’t make attacks while grappling. An animated chain reverts to its inanimate state if reduced to 0 hit points or if the devil is incapacitated or dies. |<|
| !<<reaction>> Reactions |<|<|
| !Unnerving Mask|When a creature the devil can see starts its turn within <<range 30>> of the devil, the devil can create the illusion that it looks like one of the creature’s departed loved ones or bitter enemies. If the creature can see the devil, it must succeed on a <<save Wis 14>> or be [[Frightened]] until the end of its turn. |<|
You create a bolt of lightning that arcs toward a target of your choice that you can see within range. Three bolts then leap from that target to as many as three other targets, each of which must be within 30 feet of the first target. A target can be a creature or an object and can be targeted by only one of the bolts. 

A target must make a Dexterity saving throw. The target takes 10d8 lightning damage on a failed save, or half as much on a successful one.&nbsp;
''Prerequisite:'' 15th level, Pact of the Chain feature

You can cast hold monster at will — targeting a celestial, fiend, or elemental — without expending a spell slot or material components. You must finish a long rest before you can use this invocation on the same creature again.
The archetypal Champion focuses on the development of raw physical power honed to deadly perfection. Those who model themselves on this archetype combine rigorous training with physical excellence to deal devastating blows.

{{||FighterAdvancementTemplate}}
{{||ClassAbilityTemplate}}
| !Level | !Proficiency Bonus | !Features |
| 1st | +2 |[[Fighting Style|Fighter Fighting Style]], [[Second Wind]] |
| 2nd | +2 |[[Action Surge]] (one use) |
| 3rd | +2 |//''Champion:''// [[Improved Critical]] |
| 4th | +2 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 5th | +3 |[[Extra Attack|Fighter Extra Attack]] |
| 6th | +3 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 7th | +3 |//''Champion:''// [[Remarkable Athlete]] |
| 8th | +3 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 9th | +4 |[[Indomitable]] (one use) |
| 10th | +4 |//''Champion:''// [[Additional Fighting Style]] |
| 11th | +4 |[[Extra Attack|Fighter Extra Attack]] (2) |
| 12th | +4 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 13th | +5 |[[Indomitable]] (two uses) |
| 14th | +5 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 15th | +5 |//''Champion:''// [[Superior Critical]] |
| 16th | +5 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 17th | +6 |[[Action Surge]] (two uses), [[Indomitable]] (three uses) |
| 18th | +6 |//''Champion:''// [[Survivor]] |
| 19th | +6 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| 20th | +6 |[[Extra Attack|Fighter Extra Attack]] (3) |
At 2nd level, you gain the ability to channel divine energy directly from your deity, using that energy to fuel magical effects. You start with two such effects: Turn Undead and an effect determined by your domain. Some domains grant you additional effects as you advance in levels, as noted in the domain description.

When you use your Channel Divinity, you choose which effect to create. You must then finish a short or long rest to use your Channel Divinity again.

Some Channel Divinity effects require saving throws. When you use such an effect from this class, the DC equals your cleric spell save DC.

Beginning at 6th level, you can use your Channel Divinity twice between rests, and beginning at 18th level, you can use it three times between rests. When you finish a short or long rest, you regain your expended uses.

!!! Uses for Channel Divinity

<<vtabs "[tag[Channel Divinity]tag[Ability]sort[]]">>

{{Channel Divinity}}
{{Channel Divinity}}
<<list-icons "[tag[Character]sort[published]]" "0 player characters found.">>
<<vtabs "[tag[Character Creation]sort[order]]">>
A charm is a minor supernatural gift, which can be received in a large variety of ways. For example, a wizard who finds an eldritch secret in a dead arch mage's spellbook might be infused with the magic of a charm, as might a character who solves a sphinx's riddle or drinks from a magic fountain. Legendary creatures, such as ancient gold dragons and unicorns, sometimes grace their allies with charms, and some explorers find themselves bearing the magic of a charm after discovering a long-lost location that is drenched in
primeval magic.

Some charms can be used only once, and others can be used a specific number of times before vanishing. If a charm lets you cast a spell, you are able to do so without spending a spell slot or providing any components (verbal, somatic, or material). In any case, a charm can't be used in the area created by an antimagic field or a similar effect, and a charm's effects are susceptible to dispel magic and the like. But the charm itself can't be removed from a creature by anything short of divine intervention or the wish spell.

<<sections-vertical "[tag[Charm]sort[]]">>
You attempt to charm a humanoid you can see within range. 
It must make a Wisdom saving throw, and does so with advantage if you or your companions are fighting it. If it fails the saving throw, it is [[Charmed]] by you until the spell ends or until you  or your companions do anything harmful to it.The charmed creature regards you as a friendly acquaintance. When the spell ends, the creature knows it was charmed by you.
* A charmed creature can't attack the charmer or target the charmer with harmful abilities or magical effects.
* The charmer has advantage on any ability check to interact socially with the creature.
You create a ghostly, skeletal hand in the space of a creature within range. 
Make a ranged spell attack against the creature to assail it with the chill of the grave. On a hit, the target takes <<necrotic 1d8>>, and it can’t regain hit points until the start of your next turn. Until then, the hand clings to the target. If you hit an undead target, it also has disadvantage on attack rolls against you until the end of your next turn.&nbsp;
This hollow metal tube measures about 1 foot long and weighs 1 pound. You can strike it as an action, pointing it at an object within 120 feet of you that can be opened, such as a door, lid, or lock. The chime issues a clear tone, and one lock or latch on the object opens unless the sound can’t reach the object. If no locks or latches remain, the object itself opens.

The chime can be used ten times. After the tenth time, it cracks and becomes useless.
''Multiattack.'' The chimera makes three attacks: one with its bite, one with its horns, and one with its claws. When its fire breath is available, it can use the breath in place of its bite or horns.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 2d6+4>> |<<reach 5>> |
| !<<melee Horns +7>>|<<bludgeoning 1d12+4>> |<<reach 5>> |
| !<<melee Claws +7>>|<<slashing 2d6+4>> |<<reach 5>> |
| !Fire Breath|''Recharge on 5–6''<br/>The dragon head exhales fire in a <<cone 15>>. Each creature in that area must make a <<save Dex 15>>, taking <<fire 7d8>> on a failed save, or <<halved>> on a successful one. |<|
"""
''Amphibious.'' The chuul can breathe air and water.
''Sense Magic.'' The chuul senses magic within 120 feet of it at will. This trait otherwise works like the [[Detect Magic]] spell but isn’t itself magical.
"""
<<divider>>
''Multiattack.'' The chuul makes two pincer attacks. If the chuul is grappling a creature, the chuul can also use its tentacles once.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pincer +6>>|<<bludgeoning 2d6+4>> |<<reach 10>> |
|~|The target is [[Grappled]], <<skillcheck Escape 14>>. if it is a Large or smaller creature and the chuul doesn’t have two other creatures grappled. |<|
| !Tentacles|One creature [[Grappled]] by the chuul must succeed on a <<save Con 13>> or be [[Poisoned]] for <<time 1m>>. Until this poison ends, the target is [[Paralyzed]]. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
A sphere of negative energy ripples out in a 60-foot-radius sphere from a point within range. Each creature in that area must make a Constitution saving throw. A target takes 8d6 necrotic damage on a failed save, or half as much damage on a successful one.
The Circle of the Land is made up of mystics and sages who safeguard ancient knowledge and rites through a vast oral tradition. These druids meet within sacred circles of trees or standing stones to whisper primal secrets in Druidic. The circle’s wisest members preside as the chief priests of communities that hold to the Old Faith and serve as advisors to the rulers of those folk. As a member of this circle, your magic is influenced by the land where you were initiated into the circle’s mysterious rites.

{{||DruidAdvancementTemplate}}
{{||ClassAbilityTemplate}}
When you choose this circle at 2nd level, you learn one additional druid cantrip of your choice.

Your mystical connection to the land infuses you with the ability to cast certain spells. At 3rd, 5th, 7th, and 9th level you gain access to circle spells connected to the land where you became a druid. Choose that land — arctic, coast, desert, forest, grassland, mountain, swamp, or Underdark — and consult the associated list of spells.

Once you gain access to a circle spell, you always have it prepared, and it doesn’t count against the number of spells you can prepare each day. If you gain access to a spell that doesn’t appear on the druid spell list, the spell is nonetheless a druid spell for you.

<<sections-vertical "[tag[Circle Spells]sort[]]">>
While wearing this circlet, you can use an action to cast the [[Scorching Ray]] spell with it. When you make the spell’s attacks, you do so with an attack bonus of +5. The circlet can’t be used this way again until the next dawn.
You create an invisible sensor within range in a location familiar to you (a place you have visited or seen before) or in an obvious location that is unfamiliar to you (such as behind a door, around a corner, or in a grove of trees). The sensor remains in place for the duration, and it can't be attacked or otherwise interacted with.

When you cast the spell, you choose seeing or hearing. You can use the chosen sense through the sensor as if you were in its space. As your action, you can switch between seeing and hearing.

A creature that can see the sensor (such as a creature benefiting from [[See Invisibility]] or [[Truesight]]) sees a luminous, intangible orb about the size of your fist.
<<list-icons "[tag[Class]sort[]]" "0 classes found.">>
\define abilities(level)
!!! Level $level$
<div style="padding-left:1em;"><$list filter="[list[]] +[tagging[]tag[Ability]level[$level$]sort[]]" emptyMessage="//No new abilities at this level.//"><$macrocall $name=fold tiddler=<<currentTiddler>>/></$list></div>
\end

<<abilities 1>>
<<abilities 2>>
<<abilities 3>>
<<abilities 4>>
<<abilities 5>>
<<abilities 6>>
<<abilities 7>>
<<abilities 8>>
<<abilities 9>>
<<abilities 10>>
<<abilities 11>>
<<abilities 12>>
<<abilities 13>>
<<abilities 14>>
<<abilities 15>>
<<abilities 16>>
<<abilities 17>>
<<abilities 18>>
<<abilities 19>>
<<abilities 20>>
"""
''Acid Absorption.'' Whenever the golem is subjected to acid damage, it takes no damage and instead regains a number of hit points equal to the acid damage dealt.
''Berserk.'' Whenever the golem starts its turn with 60 hit points or fewer, roll a <<roll 1d6>>. On a 6, the golem goes berserk. On each of its turns while berserk, the golem attacks the nearest creature it can see. If no creature is near enough to move to and attack, the golem attacks an object, with preference for an object smaller than itself. Once the golem goes berserk, it continues to do so until it is destroyed or regains all its hit points.
''Immutable Form.'' The golem is immune to any spell or effect that would alter its form.
''Magic Resistance.'' The golem has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The golem’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The golem makes two slam attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +8>>|<<bludgeoning 2d10+5>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a M<<save Con 15>> or have its hit point maximum reduced by an amount equal to the damage taken. The target dies if this attack reduces its hit point maximum to 0. The reduction lasts until removed by the [[Greater Restoration]] spell or other magic. |<|
| !Haste|''Recharge 5–6''<br/>Until the end of its next turn, the golem magically gains a <<ac +2>>, has <<save Dex "<span class=icon-advantage/>">>, and can use its slam attack as a <<ba>>. |<|
Beginning at 14th level, you can use your action to end one spell on yourself or on one willing creature that you touch.

You can use this feature a number of times equal to your Charisma modifier (a minimum of once). You regain expended uses when you finish a long rest.
As a cleric, you gain the following class features.

!!! Hit Points
"""
''Hit Dice:'' 1d8 per cleric level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per cleric level after 1st
"""

!!! Proficiencies
"""
''Armor:'' Light armor, medium armor, shields
''Weapons:'' Simple weapons
''Tools:'' None
''Saving Throws:'' Wisdom, Charisma
''Skills:'' Choose two from History, Insight, Medicine, Persuasion, and Religion
"""

!!! Equipment
You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a mace or (b) a warhammer (if proficient)
(a) scale mail, (b) leather armor, or (c) chain mail (if proficient)
(a) a light crossbow and 20 bolts or (b) any simple weapon
(a) a priest’s pack or (b) an explorer’s pack
A shield and a holy symbol
"""


!!! Subclasses

<<list-box "[tag[Cleric]tag[Subclass]sort[]]">>

{{||ClericAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Cleric Spellcasting]] [[Divine Domain]] [[Channel Divinity]] [[Harness Divine Power]] [[Cleric Ability Score Improvement]] [[Cleric Cantrip Versatility]] [[Blessed Strikes]] [[Destroy Undead]] [[Divine Intervention]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Cleric Ability Score Improvement}}
{{Cleric Ability Score Improvement}}
{{Cleric Ability Score Improvement}}
{{Cleric Ability Score Improvement}}
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can replace one cantrip you learned from this class’s Spellcasting feature with another cantrip from the cleric spell list.
<<spelltable "[[Guidance]] [[Light]] [[Mending]] [[Resistance]] [[Sacred Flame]] [[Spare the Dying]] [[Thaumaturgy]] [[Toll the Dead]] [[Word of Radiance]]">>
As a conduit for divine power, you can cast cleric spells. See Spells Rules for the general rules of spellcasting and the Spells Listing for the cleric spell list.

!!! Cantrips
At 1st level, you know three cantrips of your choice from the cleric spell list. You learn additional cleric cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Cleric table.

!!! Preparing and Casting Spells
The Cleric table shows how many spell slots you have to cast your cleric spells of 1st level and higher. To cast one of these spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

You prepare the list of cleric spells that are available for you to cast, choosing from the cleric spell list. When you do so, choose a number of cleric spells equal to your Wisdom modifier + your cleric level (minimum of one spell). The spells must be of a level for which you have spell slots.

For example, if you are a 3rd-level cleric, you have four 1st-level and two 2nd-level spell slots. With a Wisdom of 16, your list of prepared spells can include six spells of 1st or 2nd level, in any combination. If you prepare the 1st-level spell cure wounds, you can cast it using a 1st-level or 2nd-level slot. Casting the spell doesn’t remove it from your list of prepared spells.

You can change your list of prepared spells when you finish a long rest. Preparing a new list of cleric spells requires time spent in prayer and meditation: at least 1 minute per spell level for each spell on your list.

!!! Spellcasting Ability
Wisdom is your spellcasting ability for your cleric spells. The power of your spells comes from your devotion to your deity. You use your Wisdom whenever a cleric spell refers to your spellcasting ability. In addition, you use your Wisdom modifier when setting the saving throw DC for a cleric spell you cast and when making an attack roll with one.

"""
''Spell save DC ='' 8 + your proficiency bonus + your Wisdom modifier

''Spell attack modifier ='' your proficiency bonus + your Wisdom modifier
"""

!!! Ritual Casting
You can cast a cleric spell as a ritual if that spell has the ritual tag and you have the spell prepared.

!!! Spellcasting Focus
You can use a holy symbol (see the Adventuring Gear section) as a spellcasting focus for your cleric spells.
<<htabs "[tag[Cleric Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsOiyuAsZlYPqt9gPT6nWvD5zc5/S6z4/ctPf+P4gc4ONLmRoj4YZjI2GF42BhJtihZSfFomRmBqdnJwOkZegAqGvoIWZp5mup5isoa6QqrKTtrWWsriZvbuMub6Pr6+xc8DFxsTBgsnEy33Ay4LAg9J81MfWZ9jR2mvc395f0NviU+Tp5ljm5mPr3O1X7+PhUvP/9Ub3/flK+/j9SP0j96AVcNxFfw2cEZ7iQk9Jah4cIJpBw87Oew4sT+SQYRXPwocJSvjRxBmkxIMuLJlQFTYmApMQFMfy4NmNRwsuaFiyB46rSAkkTBn0AxnmhJtKQ4FvmSKtX2op3TpwphqJtKESJDrVg3Qa3BteuDr3WkifVatazZsxbT4rDGtsFaHnPjykTWM4Rbuzbxeoj5ciRfv5sgAA6gb69dwWO3AT6sgPBixo0X1O1Lk7JYzW3TxMMcWGPcjkV97iQ9GjXVpqFDsuXc2PRp0Vhhy805m3ZSyWhXtoackndv36V16xTe1/JMd9eQ13SO2c3ykK6Vqz4OPfp0uIazH7x8ezv4T+MXku0u3rZIxQPPD0+/2ji6pZfSy48c9t7VrPb+q3fOT85n/PUH3HoAYlNPfQQWqN2BvyA1IIHxucfKRxNup2BQpoB04XQZPlSKhREu+CGEqYCI3oLs3TUULy1ap6JU5BllDI3hxbiigTJCw1pGOJbo4DAJAmkfkeUlI+CIRRrp3YP7+Ugik9dx8+R7SyrZJJL0YYmhlAw2E+SM/RWX4zoUxjaml8EdeSN8Uj5XJn4SGkkUmyxGCeV97cXZ4JwpTklSnAaJZ+Cf/rlUJnPLKYemnuZleSduuTn6HaSRijjpoXCqJ6ZsZGq6KaB5mvgpqIhaKqeGmX75KKepIkbqaq+hup5H55n6H6WB8snopajhCqOoddKqKHiswkr+a6uu2tSpYP7YOSyvhk6ZmLShCsvlsaliuxu0VuraLLjXctvostuae6q3uaJrq7U/hTmtuO26ix13v7GLrLrd2ruqvH2Su6++wQIcrr9rClwwB2fOSu/A2voKrFMItxlxvDSliy/EfzWMscHnPvzxxQd7HHJPGW+UbMImkzzRySWvXHG0IKsMs8goEzzqzJ3ypV0hKefKc75C/fxf0DHLOrTNrZbAsY+D6bwu1OE9fRTR3VFtQtMUDRaI1VcHzbTXhoEdtstk5yH22VGlrXYfbLe9gtZwW/X23F2bbXfcdeddNs58xyD33yoELvjdfhfuNt6IJ3344oPv7bgjkEfrvgHhlOs1+eX3Sq35xop3rnDmoBM5Oliil/6t0qhXbvnq/aru+uacx04n7Yl/bnvquTPV+u4W+/746cDn2/jwtRvfd/HI674848o3H/Xs0OvI8vQQSz89v9aH3rv12m+P08TgF4w99N+P/zrs45+P/oTts9599uK/T331689PP/HPt89+/harD77++S965WvewgZIvqP5D14IrJ/waFelBjosfsPbkQQn+EDXWfCC18Od8TbIQQdmcHUgDGGSQijCEZbuhCj8lweRx0ATqnB3L2yhDW+IwxzqcIc87KEPfwjEIApxiEQsIgsKAAA7
|max top|k
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !Spell Slots Per Level |<|<|<|<|<|<|<|<|
|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 |<<list-abilities 1>> | 3 | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 |<<list-abilities 2>> | 3 | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 |<<list-abilities 3>> | 3 | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 |<<list-abilities 4>> | 4 | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 |<<list-abilities 5>> | 4 | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 |<<list-abilities 6>> | 4 | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 |<<list-abilities 7>> | 4 | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 |<<list-abilities 8>> | 4 | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 |<<list-abilities 9>> | 4 | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 |<<list-abilities 10>> | 5 | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 |<<list-abilities 11>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 |<<list-abilities 12>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 |<<list-abilities 13>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 |<<list-abilities 14>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 |<<list-abilities 15>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 |<<list-abilities 16>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 |<<list-abilities 17>> | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 |<<list-abilities 18>> | 5 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 |<<list-abilities 19>> | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 |<<list-abilities 20>> | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
A monster that has a climbing speed can use all or part of its movement to move on vertica l surfaces. The monster doesn't need to spend extra movement to climb.
While climbing or swimming, each foot of movement costs 1 extra foot (2 extra feet in difficult terrain). unless a creature has a climbing or swimming speed. ''At the DM's option'', climbing a slippery vertical surface or one with few handholds requires a successful ''Strength (Athletics) check''. Similarly, gaining any distance in rough water might require a successful Strength (Athletics) check.
This fine garment is made of black silk interwoven with faint silvery threads. While wearing it, you gain the following benefits:

* You have resistance to <<poison poison>> damage.
* You have a climbing speed equal to your walking speed.
* You can move up, down, and across vertical surfaces and upside down along ceilings, while leaving your hands free.
* You can’t be caught in webs of any sort and can move through webs as if they were difficult terrain.
* You can use an action to cast the [[Web]] spell (<<save "Spell DC" 13>>). The web created by the spell fills twice its normal area. Once used, this property of the cloak can’t be used again until the next dawn.
While you wear this cloak, it projects an illusion that makes you appear to be standing in a place near your actual location, causing any creature to have disadvantage on attack rolls against you. If you take damage, the property ceases to function until the start of your next turn. This property is suppressed while you are [[Incapacitated]], [[Restrained]], or otherwise unable to move.
While you wear this cloak with its hood up, Wisdom (Perception) checks made to see you have disadvantage, and you have advantage on Dexterity (Stealth) checks made to hide, as the cloak’s color shifts to camouflage you. Pulling the hood up or down requires an action.
''Prerequisite:'' 5th level

As a bonus action, you can surround yourself with a magical aura that looks like buzzing flies. The aura extends 5 feet from you in every direction, but not through total cover. It lasts until you’re [[Incapacitated]] or you dismiss it as a bonus action.

The aura grants you advantage on Charisma (Intimidation) checks but disadvantage on all other Charisma checks. Any other creature that starts its turn in the aura takes poison damage equal to your Charisma modifier (minimum of 0 damage).

Once you use this invocation, you can’t use it again until you finish a short or long rest.

You gain a +1 bonus to AC and saving throws while you wear this cloak.
While wearing this cloak, you have advantage on Dexterity (Stealth) checks. In an area of <<dim>> or <<darkness>>, you can grip the edges of the cloak with both hands and use it to fly at a speed of 40 feet. If you ever fail to grip the cloak’s edges while flying in this way, or if you are no longer in <<dim>> or <<darkness>>, you lose this flying speed.

While wearing the cloak in an area of dim light or darkness, you can use your action to cast [[Polymorph]] on yourself, transforming into a bat. While you are in the form of the bat, you retain your Intelligence, Wisdom, and Charisma scores. The cloak can’t be used this way again until the next dawn.
While wearing this cloak with its hood up, you can breathe underwater, and you have a swimming speed of 60 feet. Pulling the hood up or down requires an action.
"""
''Damage Transfer.'' While attached to a creature, the cloaker takes only half the damage dealt to it (rounded down), and that creature takes the other half.
''False Appearance.'' While the cloaker remains motionless without its underside exposed, it is indistinguishable from a dark leather cloak.
''Light Sensitivity.'' While in <<bright>>, the cloaker has disadvantage on attack rolls and Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The cloaker makes two attacks: one with its bite and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 2d6+3>> |<<reach 5>> |
|~|If the target is Large or smaller, the cloaker attaches to it. If the cloaker has advantage against the target, the cloaker attaches to the target’s head, and the target is [[Blinded]] and unable to breathe while the cloaker is attached. While attached, the cloaker can make this attack only against the target and has advantage on the attack roll. The cloaker can detach itself by spending 5 feet of its movement. A creature, including the target, can take its action to detach the cloaker by succeeding on a <<skillcheck Str 16>> |<|
| !<<melee Tail +6>>|<<slashing 1d8+3>> |<<reach 10>> |
| !Moan|Each creature within <<range 60>> of the cloaker that can hear its moan and that isn’t an aberration must succeed on a <<save Wis 13>> or become [[Frightened]] until the end of the cloaker’s next turn. If a creature’s saving throw is successful, the creature is immune to the cloaker’s moan for the next <<time 24h>>. |<|
| !Phantasms|''Recharges after a Short or Long Rest''<br/>The cloaker magically creates three illusory duplicates of itself if it isn’t in <<bright>>. The duplicates move with it and mimic its actions, shifting position so as to make it impossible to track which cloaker is the real one. If the cloaker is ever in an area of <<bright>>, the duplicates disappear.<br/>&nbsp;<br/>Whenever any creature targets the cloaker with an attack or a harmful spell while a duplicate remains, that creature rolls randomly to determine whether it targets the cloaker or one of the duplicates. A creature is unaffected by this magical effect if it can’t see or if it relies on senses other than sight.<br/>&nbsp;<br/>A duplicate has the cloaker’s AC and uses its saving throws. If an attack hits a duplicate, or if a duplicate fails a saving throw against an effect that deals damage, the duplicate disappears. |<|


This toy is a clockwork animal, monster, or person, such as a frog, mouse, bird, dragon, or soldier. When placed on the ground, the toy moves 5 feet across the ground on each of your turns in a random direction. It makes noises as appropriate to the creature it represents.
<div>This spell grows an inert duplicate of a living creature as a safeguard against death. 
This clone forms inside a sealed vessel and grows to full size and maturity after 120 days; you can also choose to have the clone be a younger version of the same creature. It remains inert and endures indefinitely, as long as its vessel remains undisturbed.


&nbsp;At any time after the clone matures, if the original creature dies, its soul transfers to the clone, provided that the soul is free and willing to return. The clone is physically identical to the original and has the same personality, memories, and abilities, but none of the original’s equipment. The original creature’s physical remains, if they still exist, becom e inert and can’t thereafter be restored to life, since the creature’s soul is elsewhere.
</div>
"""
''Keen Smell.'' The giant has advantage on Wisdom (Perception) checks that rely on smell.
''Innate Spellcasting.'' The giant’s innate spellcasting ability is Charisma. It can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Magic]], [[Fog Cloud]], [[Light]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Feather Fall]], [[Fly]], [[Misty Step]], [[Telekinesis]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Control Weather]], [[Gaseous Form]]
"""
<<divider>>
''Multiattack.'' The giant makes two morningstar attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Morningstar +12>>|<<piercing 3d8+8>> |<<reach 10>> |
| !<<ranged Rock +12>>|<<bludgeoning 4d10+8>> |<<range 60/240>> |
You create a 20-foot-radius sphere of poisonous, yellow-green fog centered on a point you choose within range. The fog spreads around corners. It lasts for the duration or until strong wind dispereses the fog, ending the spell. Its area is heavily obscured. 

When a creature enters the spell’s area for the first time on a turn or starts its turn there, that creature must make a Constitution saving throw. The creature takes 5d8 poison damageon a failed save, or half as much damage on a successful one. Creatures are affected even if they hold their breath or don’t need to breathe. 

The fog moves 10 feet away from you at the start of each of your turns, rolling along the surface of the ground. The vapors, being heavier than air, sink to the lowest level of the land, even pouring down openings.&nbsp;
| !Druid Level | !Spells |
| !3rd |[[Mirror Image]], [[Misty Step]] |
| !5th |[[Water Breathing]], [[Water Walk]] |
| !7th |[[Control Water]], [[Freedom of Movement]] |
| !9th |[[Conjure Elemental]], [[Scrying]] |
Although the cobbler’s trade might seem too humble for an adventurer, a good pair of boots will see a character across rugged wilderness and through deadly dungeons.

''Components.'' Cobbler’s tools consist of:

* a hammer
* an awl
* a knife
* a shoe stand
* a cutter
* spare leather
* thread

''Arcana, History.'' Your knowledge of shoes aids you in identifying the magical properties of enchanted boots or the history of such items.

''Investigation.'' Footwear holds a surprising number of secrets. You can learn where someone has recently visited by examining the wear and the dirt that has accumulated on their shoes. Your experience in repairing shoes makes it easier for you to identify where damage might come from.

''Maintain Shoes.'' As part of a long rest, you can repair your companions’ shoes. For the next 24 hours, up to six creatures of your choice who wear shoes you worked on can travel up to 10 hours a day without making saving throws to avoid exhaustion.

''Craft Hidden Compartment.'' With 8 hours of work, you can add a hidden compartment to a pair of shoes. The compartment can hold an object up to 3 inches long and 1 inch wide and deep. You make an Intelligence check using your tool proficiency to determine the Intelligence (Investigation) check DC needed to find the compartment.

| !Activity | !DC |
|!Determine a shoe’s age and origin | 10 |
|!Find a hidden compartment in a boot heel | 15 |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d4+1>> |<<reach 5>> |
|~|Target must succeed on a <,save Con 11>> against being magically [[Petrified]]. On a failed save, the creature begins to turn to stone and is [[Restrained]]. It must repeat the saving throw at the end of its next turn. On a success, the effect ends. On a failure, the creature is [[Petrified]] for <<time 24h>>. |<|
"""
''Mechanical Trap''
"""
This trap uses a trip wire to collapse the supports keeping an unstable section of a ceiling in place. The trip wire is 3 inches off the ground and stretches between two support beams. 

|max top|k
|!Detection |<<perception 10>> to spot the trip wire |
|!Trigger |Breaking the trip wire, or knocking over an overhead beam. |
|!Effect |Anyone beneath trap <<save Dex 15>>, taking <fail><<bludgeoning 4d10>></fail>, <pass><<halved>></pass>. <br/>Once triggered, floor area under trap is filled with rubble and is <<difficult>>. |
|!Countermeasure #1 |<<thievestools 15>> to disable trip wire. <br/><fail>Trap is triggered</fail>. |
|!Countermeasure #2 |Using a edged weapon or tool to disable the trip wire, <<skillcheck Dex 15>> at disadvantage.<br/><fail>Trap is triggered</fail> |
|!Countermeasure #3 |Trigger the trap by knocking over an overhead beam. |
Bards of the College of Lore know something about most things, collecting bits of knowledge from sources as diverse as scholarly tomes and peasant tales. Whether singing folk ballads in taverns or elaborate compositions in royal courts, these bards use their gifts to hold audiences spellbound. When the applause dies down, the audience members might find themselves questioning everything they held to be true, from their faith in the priesthood of the local temple to their loyalty to the king.

The loyalty of these bards lies in the pursuit of beauty and truth, not in fealty to a monarch or following the tenets of a deity. A noble who keeps such a bard as a herald or advisor knows that the bard would rather be honest than politic.

The college’s members gather in libraries and sometimes in actual colleges, complete with classrooms and dormitories, to share their lore with one another. They also meet at festivals or affairs of state, where they can expose corruption, unravel lies, and poke fun at self-important figures of authority.

{{||BardAdvancementTemplate}}
{{||ClassAbilityTemplate}}
A dazzling array of flashing, colored light springs from your hand. Roll 6d10; the total is how many hit points of creatures this spell can affect. Creatures in a 15-foot cone originating from you are affected in ascending order of their current hit points (ignoring [[Unconscious]] creatures and creatures that can't see).

Starting with the creature that has the lowest current hit points, each creature affected by this spell is blinded until the end of your next turn. Subtract each creature's hit points from the total before moving on to the creature with the next lowest hit points. A creature's hit points must be equal to or less than the remaining total for that creature to be affected.
Your tenacity can wear down the most potent foes. When you hit a creature with a weapon attack, the creature takes an extra 1d8 damage if it’s below its hit point maximum. You can deal this extra damage only once per turn.
<<vtabs "[tag[Rule]tag[Combat]sort[order]]">>
|max top|k
| !Standard Actions	 |<|
|![[Attack]] |Pretty straight forward. Grappling, pushing and shoving are also considered an attack. |
|!Cast Spell |Pretty straight forward  |
|!Dash |''Extra movement.'' Doubles move distance |
|!Disengage |''Good when surrounded.'' Allow moving away from opponents without receiving opportunity attacks |
|!Dodge |''Avoid melee and ranged attacks.'' Attack rolls on me get disadvantage (only applies when I can see attacker) |
|~|''Avoid nuke spells.'' Advantage to all dexterity saving throws |
|!Help |''Assist teammate with ability check.'' Gives advantage to teammate's next ability roll |
|~|''Assist in melee attack. (Not good)'' Gives advantage to next attack roll. |
|!Hide |''Avoid combat.'' (See [[Hiding]]) |
|!Ready |''Declaration to wait till a condition occurs, then do a specific action.'' |
|!Search |''Spend all 6 seconds searching.'' |
|!Use An Object |''Any interaction with 1 object for 6 seconds.'' |
You speak a one-word command to a creature you can see within range. 
The target must succeed on a Wisdom saving throw or follow the command on its next turn. The spell has no effect if the target is undead, if it doesn’t understand your language, or if your command is directly harmful to it.  Some typical commands and their effects follow. You might issue a command other than one described here. If you do so, the DM determines how the target behaves. If the target can’t follow your command, the spell ends.
<br /><b>Approach&nbsp;</b>The target moves toward you by the shortest and most direct route, ending its turn if it moves within 5 feet of you.
<br /><b>Drop&nbsp;</b>The target drops whatever it is holding and then ends its turn.
<br /><b>Flee&nbsp;</b>The target spends its turn moving away from you by the fastest available means.
<br /><b>Grovel&nbsp;</b>The target falls prone and then ends its turn.
<br /><b>Halt&nbsp;</b>The target doesn’t move and takes no actions. A flying creature stays aloft, provided that it is able to do so. If it must move to stay aloft, it flies the minimum distance needed to remain in the air.&nbsp;
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Club +2>>|<<bludgeoning 1d4>> |<<reach 5>> |
You contact your deity or a divine proxy and ask up to three questions that can be answered with a yes or no. You must ask your questions before the spell ends. You receive a correct answer for each question. 

Divine beings aren’t necessarily omniscient, so you might receive “unclear” as an answer if a question pertains to information that lies beyond the deity’s knowledge. In a case where a one-word answer could be misleading or contrary to the deity’s interests, the DM might offer a short phrase as an answer instead. 

If you cast the spell two or more times before finishing your next long rest, there is a cumulative 25 percent chance for each casting after the first that you get no answer. The DM makes this roll in secret.
You briefly become one with nature and gain knowledge of the surrounding territory. 
In the outdoors, the spell gives you knowledge of the land within 3 miles of you. In caves and other natural underground settings, the radius is limited to 300 feet. The spell doesn’t function where nature has been replaced by construction, such as in dungeons and towns. 

You instantly gain knowledge of up to three facts of your choice about any of the following subjects as they relate to the area: 

•  terrain and bodies of water 
•  prevalent plants, minerals, animals, or peoples 
•  powerful celestials, fey, fiends, elementals, or undead 
•  influence from other planes of existence 
•  buildings 

For example, you could determine the location of powerful undead in the area, the location of major sources of safe drinking water, and the location of any nearby towns.
For the duration, you understand the literal meaning of any spoken language that you hear. 
You also understand any spoken language that you hear. You also understand any written language that you see, but you must be touching the surface of which the words are written. It takes about 1 minute to read one page of text. 

This spell doesn’t decode secret messages in a text or glyph, such as an arcane sigil, that isn’t part of a written language.
Creatures of your choice that you can see within range and that can hear you must make a Wisdom saving throw. 
A target automatically succeeds on this saving throw if it can’t be [[Charmed]]. On a failed save, a target is affected by this spell. Until the spell ends, you can use a bonus action on each of your turns to designate a direction that is horizontal to you. Each affected target must use as much of its movement as possible to move in that direction on its next turn. It can take its action before it moves. After moving in this way, it can make another Wisdom saving throw to try to end the effect. 

A target isn’t compelled to move into an obviously deadly hazard, such as a fire pit, but it will provoke opportunity attacks to move in the designated direction.
<table>
<tr><th>Spell</th><th>Duration</th></tr>
<$list filter="[tag[Spell]field:concentration[Yes]sort[title]]" emptyMessage="<tr><td>No spells found.</td></tr>">
  <tr>
    <th align="left"><$link to=<<currentTiddler>> ><<currentTiddler>></$link></th>
    <td align="left">{{!!duration}}</td>
  </tr>
</$list>
</table>
|max top|k
| !Condition | !Effect |
|![[Blinded]] |<$transclude tiddler=Blinded mode=block/> |
|![[Charmed]] |<$transclude tiddler=Charmed mode=block /> |
|![[Deafened]] |<$transclude tiddler=Deafened mode=block /> |
|![[Exhaustion]] |<$transclude tiddler=Exhaustion mode=block /> |
|![[Frightened]] |<$transclude tiddler=Frightened mode=block /> |
|![[Grappled]] |<$transclude tiddler=Grappled mode=block /> |
|![[Incapacitated]] |<$transclude tiddler=Incapacitated mode=block /> |
|![[Invisible]] |<$transclude tiddler=Invisible mode=block /> |
|![[Paralyzed]] |<$transclude tiddler=Paralyzed mode=block /> |
|![[Petrified]] |<$transclude tiddler=Petrified mode=block /> |
|![[Poisoned]] |<$transclude tiddler=Poisoned mode=block /> |
|![[Prone]] |<$transclude tiddler=Prone mode=block /> |
|![[Restrained]] |<$transclude tiddler=Restrained mode=block /> |
|![[Stunned]] |<$transclude tiddler=Stunned mode=block /> |
|![[Unconscious]] |<$transclude tiddler=Unconscious mode=block /> |
<div class="tc-table-of-contents">
{{Condition||Link}}

<<toc-selective-expandable "Condition"  "sort[order]">>

</div>
A blast of cold air erupts from your hands. 
Each creature in a 60-foot cone must make a Constitution saving throw. 

A creature takes 8d8 cold damage on a failed save, or half as much damage on a successful one. A creature killed by this spell becomes a frozen statue until it thaws.
<<vtabs "[tag[Config]sort[]]">>
This spell assaults and twists creatures’ minds, spawning delusions and provoking uncontrolled actions. Each creature in a 10-foot-radius sphere centered on a point you choose within range must succeed on a Wisdom saving throw when you cast this spell or be affected by it. 

An affected target can’t take reactions and must roll a d10 at the start of each of its turns to determine its behavior for that turn. 

| !1d10 | !Behavior |
| !1 |The creature uses all its movement to move in a random direction. To determine the direction, roll a d8 and assign a direction to each die face. The creature doesn’t take an action this turn.  |
| !2-6 |The creature doesn’t move or take actions this turn.  |
| !7-8 |The creature uses its action to make a melee attack against a randomly determined creature within its reach. If there is no creature within its reach, the creature does nothing this turn.  |
| !9-10 |The creature can act and move normally.  |

At the end of its turns, an affected target can make a Wisdom saving throw. It it succeeds, this effect ends for that target.
You summon fey spirits that take the form of beasts and appear in unoccupied spaces that you can see within range. Choose one of the following options for what appears:

* One beast of challenge rating 2 or lower
* Two beasts of challenge rating 1 or lower
* Four beasts of challenge rating 1/2 or lower
* Eight beasts of challenge rating 1/4 or lower

Each beast is also considered fey, and it disappears when it drops to 0 hit points or when the spell ends.

The summoned creatures are friendly to you and your companions. Roll initiative for the summoned creatures as a group, which has its own turns. They obey any verbal commands that you issue to them (no action required by you). If you don't issue any commands to them, they defend themselves from hostile creatures, but otherwise take no actions.

The GM has the creatures' statistics. Sample creatures can be found below.

{{Conjure Animals Guide}}
* One beast of challenge rating 2 or lower
* Two beasts of challenge rating 1 or lower
* Four beasts of challenge rating 1/2 or lower
* Eight beasts of challenge rating 1/4 or lower

<div style="display:flex;">

| !d20 | !CR 1/4 |
| !1 |[[Axe Beak]] |
| !2 |[[Boar]] |
| !3 |[[Constrictor Snake]] |
| !4 |[[Draft Horse]] |
| !5 |[[Elk]] |
| !6 |[[Giant Badger]] |
| !7 |[[Giant Bat]] |
| !8 |[[Giant Centipede]] |
| !9 |[[Giant Frog]] |
| !10 |[[Giant Lizard]] |
| !11 |[[Giant Owl]] |
| !12 |[[Giant Poisonous Snake]] |
| !13 |[[Giant Wolf Spider]] |
| !14 |[[Panther]] |
| !15 |[[Pteranodon]] |
| !16 |[[Riding Horse]] |
| !17 |[[Swarm of Bats]] |
| !18 |[[Swarm of Rats]] |
| !19 |[[Swarm of Ravens]] |
| !20 |[[Wolf]] |

| !d10 | !CR 1/2 |
| !0 |//CR 1/4 Beast// |
| !1 |[[Ape]] |
| !2 |[[Black Bear]] |
| !3 |[[Crocodile]] |
| !4 |[[Giant Goat]] |
| !5 |[[Giant Sea Horse]] |
| !6 |[[Giant Wasp]] |
| !7 |[[Reef Shark]] |
| !8 |[[Swarm of Insects]] |
| !9 |[[Warhorse]] |

| !d12 | !CR 1 |
| !1 |//CR 1/2 Beast// |
| !2 |[[Brown Bear]] |
| !3 |[[Dire Wolf]] |
| !4 |[[Giant Eagle]] |
| !5 |[[Giant Hyena]] |
| !6 |[[Giant Octopus]] |
| !7 |[[Giant Spider]] |
| !8 |[[Giant Toad]] |
| !9 |[[Giant Vulture]] |
| !10 |[[Lion]] |
| !11 |[[Swarm of Quippers]] |
| !12 |[[Tiger]] |

| !d10 | !CR 2 |
| !0 |[[Cave Bear]] |
| !1 |[[Polar Bear]] |
| !2 |[[Giant Boar]] |
| !3 |[[Giant Constrictor Snake]] |
| !4 |[[Giant Elk]] |
| !5 |[[Hunter Shark]] |
| !6 |[[Plesiosaurus]] |
| !7 |[[Rhinoceros]] |
| !8 |[[Saber-toothed Tiger]] |
| !9 |[[Swarm of Poisonous Snakes]] |

</div>
You summon a celestial of challenge rating 4 or lower, which appears in an unoccupied space that you can see within range. The celestial disappears when it drops to 0 hit points or when the spell ends. 

The celestial is friendly to you and your companions for the duration. Roll initiative for the celestial, which has its own turns. It obeys any verbal commands that you issue to it (no action required by you), as long as they don’t violate its alignment. If you don’t issue any commands to the celestial, it defends itself from hostile creatures but otherwise takes no actions 
The DM has the celestial’s statistics.&nbsp;
You call forth an elemental servant. 
Choose an area of air, earth, fire, or water that fills a 10-foot cube within range. An elemental of challenge rating 5 or lower appropriate to the area you chose appears in an unoccupied space within 10 feet of it. For example, a fire elemental emerges from a bonfire, and an earth elemental rises up from the ground. The elemental disappears when it drops to 0 hit points or when the spell ends. 

The elemental is friendly to you and your companions for the duration. Roll initiative for the elemental, which has its own turns. It obeys any verbal commands that you issue to it (no action required by you). If you don’t issue any commands to the elemental, it defends itself from hostile creatures but otherwise takes no actions. 

If your concentration is broken, the elemental doesn’t disappear. Instead, you lose control of the elemental, it becom es hostile toward you and your companions, and it might attack. An uncontrolled elemental can’t be dismissed by you, and it disappears 1 hour after you summoned it. The DM has the elemental’s statistics.&nbsp;
You summon a fey creature of challenge rating 6 or lower, or a fey spirit that takes the form of a beast of challenge rating 6 or lower. 
It appears in an unoccupied space that you can see within range. The fey creature disappears when it drops to 0 hit points or when the spell ends. 

The fey creature is friendly to you and your companions for the duration. Roll initiative for the creature, which has its own turns. It obeys any verbal commands that you issue to it (no action required by you), as long as they don’t violate its alignment. If you don’t issue any commands to the fey creature, it defends itself from hostile creatures but otherwise takes no actions. 

If your concentration is broken, the fey creature doesn’t disappear. Instead, you lose control of the fey creature, it becomes hostile toward you and your companions, and it might attack. An uncontrolled fey creature can’t be dismissed by you, and it disappears 1 hour after you summoned it. 
The DM has the fey creature’s statistics.&nbsp;
You summon elementals that appear in unoccupied spaces that you can see within range.
&nbsp;You choose one the following options for what appears: 
-One elemental of challenge rating 2 or lower 
-Two elementals of challenge rating 1 or lower 
-Four elementals of challenge rating 1/2 or lower 
-Eight elementals of challenge rating 1/4 or lower. 

An elemental summoned by this spell disappears when it drops to 0 hit points or when the spell ends. 

The summoned creatures are friendly to you and your companions. Roll initiative for the summoned creatures as a group, which has its own turns. They obey any verbal commands that you issue to them (no action required by you). If you don’t issue any commands to them, they defend themselves from hostile creatures, but otherwise take no actions. 
The DM has the creatures’ statistics.&nbsp;
You summon fey creatures that appear in unoccupied spaces that you can see within range. 

Choose one of the following options for what appears: 

* One fey creature of challenge rating 2 or lower 
* Two fey creatures of challenge rating 1 or lower 
* Four fey creatures of challenge rating 1/2 or lower 
* Eight fey creatures of challenge rating 1/4 or lower 

A summoned creature disappears when it drops to 0 hit points or when the spell ends. 

The summoned creatures are friendly to you and your companions. Roll initiative for the summoned creatures as a group, which have their own turns. They obey any verbal commands that you issue to them (no action required by you). If you don’t issue any commands to them, they defend themselves from hostile creatures, but otherwise take no actions. 

The DM has the creatures’ statistics.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<melee Constrict +4>>|<<bludgeoning 1d8+2>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 14>>). Until this grapple ends, the creature is [[Restrained]], and the snake can’t constrict another target. |<|
Constructs are made, not born. Some are programmed by their creators to'follow a simple set of instructions, while others are imbued with sentience and capable of independent thought. Golems are the iconic constructs. Many creatures native to the outer plane of Mechanus, such as modrons, are constructs shaped from the raw material of the plane by the will of more powerful creatures.

<<list-box "[tag[Construct]sort[]]" "No constructs found.">>
You mentally contact a demigod, the spirit of a long-dead sage, or some other mysterious entity from another plane. 
Contacting this extraplanar intelligence can strain or even break your mind. When you cast this spell, make a DC 15 Intelligence saving throw. On a failure, you take 6d6 psychic damage and are insane until you finish a long rest. While insane, you can’t take actions, can’t understand what other creatures say, can’t read, and speak only in gibberish. A greater restoration spell cast on you ends this effect. 

On a successful save, you can ask the entity up to five questions. You must ask your questions before the spell ends. The DM answers each question with one word, such as “yes,” “no,” “maybe,” “never,” “irrelevant,” or “unclear” (if the entity doesn’t know the answer to the question). If a one-word answer would be misleading, the DM might instead offer a short phrase as an answer.
Contact poison can be smeared on an object and remains potent until it is touched or washed off. A creature that touches contact poison with exposed skin suffers its effects.

<<vtabs "[tag[Poison]tag[Contact]sort[]]">>
Your touch inflicts disease. 
Make a melee spell attack against a creature within your reach. On a hit, you afflict the creature with a disease of your choice from any of the ones described below. 

At the end of each of the target’s turns, it must make a Constitution saving throw. After failing three of these saving throws, the disease’s effects last for the duration, and the creature stops making these saves. After succeeding on three of these saving throws, the creature recovers from the disease, and the spell ends. 

Since this spell induces a natural disease in its target, any effect that removes a disease or otherwise ameliorates a disease’s effects apply to it. 

''Blinding Sickness.'' Pain grips the creature’s mind, and its eyes turn milky white. The creature has disadvantage on Wisdom checks and Wisdom saving throws and is [[Blinded]]. 

''Filth Fever.'' A raging fever sweeps through the creature’s body. The creature has disadvantage on Strength checks, Strength saving throws, and attack rolls that use Strength. 

''Flesh Rot.'' The creature’s flesh decays. The creature has disadvantage on Charisma checks and vulnerability to all damage. 

''Mindfire.'' The creature’s mind becomes feverish. The creature has disadvantage on Intelligence checks and Intelligence saving throws, and the creature behaves as if under the effects of the confusion spell during combat. 

''Seizure.'' The creature is overcome with shaking. The creature has disadvantage on Dexterity checks, Dexterity saving throws, and attack rolls that use Dexterity. 

''Slimy Doom.'' The creature begins to bleed uncontrollably. The creature has disadvantage on Constitution checks and Constitution saving throws. In addition, whenever the creature takes damage, it is [[Stunned]] until the end of its next turn.
Choose a spell of 5th level or lower that you can cast, that has a casting time of 1 action, and that can target you. 
You cast that spell —called the contingent spell— as part of casting contingency, expending spell slots for both, but the contingent spell doesn’t come into effect. Instead, it takes effect when a certain circumstance occurs. You describe that circumstance when you cast the two spells. For example, a contingency cast with water breathing might stipulate that water breathing comes into effect when you are engulfed in water or a similar liquid. 

The contingent spell takes effect immediately after the circumstance is met for the first time, whether or not you want it to. and then contingency ends. 

The contingent spell takes effect only on you, even if it can normally target others. You can use only one contingency spell at a time. If you cast this spell again, the effect of another contingency spell on you ends. Also, contingency ends on you if its material component is ever not on your person.
A flame, equivalent in brightness to a torch, springs forth from an object that you touch. 
The effect looks like a regular flame, but it creates no heat and doesn’t use oxygen. A continual flame can be covered or hidden but not smothered or quenched.
Until the spell ends, you control any freestanding water inside an area you choose that is a cube up to 100 feet on a side. 
You can choose from any of the following effects when you cast this spell. As an action on your turn, you can repeat the same effect or choose a different one. 

<b>Flood</b> 
You cause the water level of all standing water in the area to rise by as much as 20 feet. If the area includes a shore, the flooding water spills over onto dry land. If you choose an area in a large body of water, you instead create a 20-foot tall wave that travels from one side of the area to the other and then crashes down. Any Huge or smaller vehicles in the wave’s path are carried with it to the other side. Any Huge or smaller vehicles struck by the wave have a 25 percent chance of capsizing. The water level remains elevated until the spell ends or you choose a different effect. If this effect produced a wave, the wave repeats on the start of your next turn while the flood effect lasts. 

<b>Part Water</b> 
You cause water in the area to move apart and create a trench. The trench extends across the spell’s area, and the separated water forms a wall to either side. The trench remains until the spell ends or you choose a different effect. The water then slowly fills in the trench over the course of the next round until the normal water level is restored. 

<b>Redirect Flow</b>&nbsp;
You cause flowing water in the area to move in a direction you choose, even if the water has to flow over obstacles, up walls, or in other unlikely directions. The water in the area moves as you direct it, but once it moves beyond the spell’s area, it resumes its flow based on the terrain conditions. The water continues to move in the direction you chose until the spell ends or you choose a different effect. 

<b>Whirlpool</b>&nbsp;
This effect requires a body of water at least 50 feet square and 25 feet deep. You cause a whirlpool to form in the center of the area. The whirlpool forms a vortex that is 5 feet wide at the base, up to 50 feet wide at the top, and 25 feet tall. Any creature or object in the water and within 25 feet of the vortex is pulled 10 feet toward it. A creature can swim away from the vortex by making a Strength (Athletics) check against your spell save DC. 
When a creature enters the vortex for the first time on a turn or starts its turn there, it must make a Strength saving throw. On a failed save, the creature takes 2d8 bludgeoning damage and is caught in the vortex until the spell ends. On a successful save, the creature takes half damage, and isn’t caught in the vortex. A creature caught in the vortex can use its action to try to swim away from the vortex as described above, but has disadvantage on the Strength (Athletics) check to do so. 
The first time each turn that an object enters the vortex, the object takes 2d8 bludgeoning damage,&nbsp;this damage occurs each round it remains in the vortex.
You take control of the weather within 5 miles of you for the duration. 
You must be outdoors to cast this spell. Moving to a place where you don’t have a clear path to the sky ends the spell early. 

When you cast the spell, you change the current weather conditions, which are determined by the DM based on the climate and season. You can change precipitation, temperature, and wind. It takes 1d4 x 10 minutes for the new conditions to take effect. Once they do so, you can change the conditions again. When the spell ends, the weather gradually returns to normal. 

When you change the weather conditions, find a current condition on the following tables and change its stage by one, up or down. When changing the wind, you can change its direction. 

<b>Precipitation </b>
Stage 1 – Clear, 
Stage 2 – Light clouds, 
Stage 3 – Overcast or ground fog, 
Stage 4 – Rain, hail or snow, 
Stage 5 – Torrential rain, driving hail or blizzard 

<b>Temperature </b>
Stage 1 – Unbearable heat, 
Stage 2 – Hot, 
Stage 3 – Warm, 
Stage 4 – Cool, 
Stage 5 – Cold, 
Stage 6 – Arctic cold 

<b>Wind</b> 
Stage 1 – Calm, 
Stage 2 – Moderate wind, 
Stage 3 – Strong wind, 
Stage 4 – Gale, 
Stage 5 – Storm
Adventuring is a hard life. With a cook along on the journey, your meals will be much better than the typical mix of hardtack and dried fruit.

''Components.'' Cook’s utensils include:

* a metal pot
* knives
* forks
* a stirring spoon
* a ladle

''History.'' Your knowledge of cooking techniques allows you to assess the social patterns involved in a culture’s eating habits.

''Medicine.'' When administering treatment, you can transform medicine that is bitter or sour into a pleasing concoction.

''Survival.'' When foraging for food, you can make do with ingredients you scavenge that others would be unable to transform into nourishing meals.

''Prepare Meals.'' As part of a short rest, you can prepare a tasty meal that helps your companions regain their strength. You and up to five creatures of your choice regain 1 extra hit point per Hit Die spent during a short rest, provided you have access to your cook’s utensils and sufficient food.

| !Activity | !DC |
|!Create a typical meal | 10 |
|!Duplicate a meal | 10 |
|!Spot poison or impurities in food | 15 |
|!Create a gourmet meal | 15 |
The following macros are built into ~TiddlyWiki's core. For more details please look at http://tiddlywiki.com.

"""
''&lt;&lt;changecount&gt;&gt;'' - Reports the number of changes made to a tiddler.
''&lt;&lt;colour'' //name//''&gt;&gt;'' - Returns the color value for the named entry in the current palette in #rrggbb format.
''&lt;&lt;colour-picker'' //actions//''&gt;&gt;'' - Displays an interactive color picker.
''&lt;&lt;contrastcolour'' //target fallbackTarget colourA colourB//''&gt;&gt;'' - Returns a color deemed best to contrast with the target.
''&lt;&lt;copy-to-clipboard'' //src class style//''&gt;&gt;'' - Displays a button that copies the //src// text to the clipboard.
''&lt;&lt;csvtiddlers'' //filter format//''&gt;&gt;'' - Returns the //filtered// tiddlers in comma-separated value format.
''&lt;&lt;datauri'' //title//''&gt;&gt;'' - Returns a data URI for the content of the tiddler.
''&lt;&lt;dumpvariables&gt;&gt;'' - Debugging tool. Displays all variables and macros that exist at that position where the macro was called.
''&lt;&lt;image-picker'' //actions subfilter//''&gt;&gt;'' - Displays an interactive image picker.
''&lt;&lt;jsontiddler'' //tiddler//''&gt;&gt;'' - Returns the fields of a single tiddler in JSON format. 
''&lt;&lt;jsontiddlers'' //filter spaces//''&gt;&gt;'' - Returns the fields of the selected tiddlers in JSON format. //spaces// is a number, default is 4, for the number of spaces used in packing the JSON output.
''&lt;&lt;keyboard-driven-input'' //many_parameters//''&gt;&gt;'' - Creates an input field or textarea that can be cycled through using up and down keys.
''&lt;&lt;lingo'' title''&gt;&gt;'' - Used for localization, return the entry for //title// in the current language.
''&lt;&lt;list-links'' //filter type subtype class emptyMessage//''&gt;&gt;'' - Displays the //filtered// set of tiddlers as a list using html tag //type// and each entry using html tag //subtype//.
''&lt;&lt;list-links-draggable'' //many_parameters//''&gt;&gt;'' - Displays the filtered set of tiddlers as a list that can be reordered by drag-and-dropping entries.
''&lt;&lt;list-tagged-draggable&gt;&gt;'' - Displays tiddlers with the //tag// as a list that can be reordered by drag-and-dropping entries.
''&lt;&lt;list-thumbnails'' //filter width height//''&gt;&gt;'' - Displays the //filtered// list of images as linkable thumbnail panels. Default dimension is 280x157 pixels.
''&lt;&lt;makedatauri&gt;&gt;'' - Used by datauri macro to convert content into a data URI.
''&lt;&lt;now'' //format//''&gt;&gt;'' - Displays the current date and time in the specified //format//.
''&lt;&lt;qualify'' //title//''&gt;&gt;'' - Returns a unique string identifying //title//.
&lt;&lt;resolvepath&gt;&gt; - 
''Stylesheet Macros'' - Set of macros for generating CSS stylesheets
''Table-of-Contents Macros'' - Set of macros for generating a tree of tiddler links.
''&lt;&lt;tabs'' //tabsList default state class template buttonTemplate retain actions expliciteState//''&gt;&gt;'' - Presents the selected tiddlers as a set of switchable tabs.
''&lt;&lt;tag'' //tag//''&gt;&gt;'' - Displays a tag pill for the specified //tag//.
''&lt;&lt;tag-picker'' //actions tagField//''&gt;&gt;'' - Generates a combobox and button that allows a tag to be selected.
''&lt;&lt;tag-pill'' //tag element_tag element_attributes actions//''&gt;&gt;'' - Like the tag macro, but generates a static tag-pill without any of the dropdown actions.
''&lt;&lt;thumbnail'' //link image caption icon color//''&gt;&gt;'' - Set of macros that generate linkable thumbnail pictures.
''&lt;&lt;timeline'' //many_parameters//''&gt;&gt;'' - Returns a list of tiddlers in reverse chronological order of modification (or some other date_field).
''&lt;&lt;tree'' //prefix separator//''&gt;&gt;'' - Generates an expandable tree based on a //prefix// and //separator// within tiddler titles.
''&lt;&lt;unusedtitle'' //baseName//''&gt;&gt;'' - Returns an unused title.
''&lt;&lt;version&gt;&gt;'' - Returns the current version number of ~TiddlyWiki.
"""
"""
''Innate Spellcasting.'' The couatl’s spellcasting ability is Charisma, <<skillcheck "Save DC" 14>>. It can innately cast the following spells, requiring only verbal components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Evil and Good]], [[Detect Magic]], [[Detect Thoughts]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Bless]], [[Create Food and Water]], [[Cure Wounds]], [[Lesser Restoration]], [[Protection from Poison]], [[Sanctuary]], [[Shield]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Dream]], [[Greater Restoration]], [[Scrying]]
''Magic Weapons.'' The couatl’s weapon attacks are magical.
''Shielded Mind.'' The couatl is immune to [[Scrying]] and to any effect that would sense its emotions, read its thoughts, or detect its location.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +8>>|<<piercing 1d6+5>> |<<reach 5>> |
|~|Target must succeed on a <<save Con 13>> or be [[Poisoned]] for <<time 24h>>. Until this poison ends, the target is [[Unconscious]]. Another creature can use an action to shake the target awake. |<|
| !<<melee Constrict +6>>|<<bludgeoning 2d6+3>> |<<reach 10>> |
|~|Target is [[Grappled]], <<skillcheck "Escape" 15>>. Until this grapple ends, the target is [[Restrained]], and the couatl can’t constrict another target. |<|
| !Change Shape|The couatl magically polymorphs into a humanoid or beast that has a challenge rating equal to or less than its own, or back into its true form. It reverts to its true form if it dies. Any equipment it is wearing or carrying is absorbed or borne by the new form (the couatl’s choice).<br/>&nbsp;<br/>In a new form, the couatl retains its game statistics and ability to speak, but its AC, movement modes, Strength, Dexterity, and other actions are replaced by those of the new form, and it gains any statistics and capabilities (except class features, legendary actions, and lair actions) that the new form has but that it lacks. If the new form has a bite attack, the couatl can use its bite in that form. |<|

At 6th level, you gain the ability to use musical notes or words of power to disrupt mind-influencing effects. As an action, you can start a performance that lasts until the end of your next turn. During that time, you and any friendly creatures within 30 feet of you have advantage on saving throws against being [[Frightened]] or [[Charmed]]. A creature must be able to hear you to gain this benefit. The performance ends early if you are [[Incapacitated]] or silenced or if you voluntarily end it (no action required).
1 reaction, which you take when you see a creature within 60 feet of you casting a spell

You attempt to interrupt a creature in the process of casting a spell. If the creature is casting a spell of 3rd level or lower, its spell fails and has no effect. If it is casting a spell of 4th level or higher, make an ability check using your spellcasting ability.  The DC equals 10+ the spell’s level. On a success, the creature’s spell fails and has no effect.&nbsp;
Walls, trees, creatures, and other obstacles can provide cover during combat, making a target more difficult to harm. A target can benefit from cover only when an attack or other effect originates on the opposite side of the cover. 

There are three degrees of cover. If a target is behind multiple sources of cover, only the most protective degree of cover applies; the degrees aren't added together. For example, if a target is behind a creature that gives half cover and a tree trunk that gives three-quarters cover, the target has three-quarters cover. 

!! Cover

<<p "Half Cover">>
<<p "Three-Quarters Cover">>
<<p "Total Cover">>
<<p2 "Hiding">>

"""
''Amphibious.'' The crab can breathe air and water.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +0>>|<<bludgeoning 1>> |<<reach 5>> |
"""
''Price per Dose:'' 200 gp
"""

This poison must be harvested from a dead or incapacitated crawler. 

* A creature subjected to this poison must succeed on a <<save Con 13>> or be [[Poisoned]] for <<time 1m>>. 
** The [[Poisoned]] creature is [[Paralyzed]]. 
** The creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success.
You create 45 pounds of food and 30 gallons of water on the ground or in containers within range, enough to sustain up to fifteen humanoids or five steeds for 24 hours. The food is bland but nourishing, and spoils if uneaten after 24 hours. The water is clean and doesn’t go bad.
You either create or destroy water. 

<b>Create Water</b> 
You create up to 10 gallons of clean water within range in an open container. Alternatively, the water falls as rain in a 30-foot cube within range, extinguishing exposed flames in the area. 

<b>Destroy Water</b>&nbsp;
You destroy up to 10 gallons of water in an open container within range. Alternatively, you destroy fog in a 30-foot cube within range.&nbsp;
You can cast this spell only at night. Choose up to three corpses of Medium or Small humanoids within range. Each corpse becomes a [[Ghoul]] under your control. (The DM has game statistics for these creatures.) 

As a bonus action on each of your turns, you can mentally command any creature you animated with this spell if the creature is within 120 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete. 

The creature is under your control for 24 hours, after which it stops obeying any command you have given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature before the current 24-hour period ends. This use of the spell reasserts your control over up to three creatures you have animated with this spell, rather than animating new ones.&nbsp;
You pull wisps of shadow material from the Shadowfell to create a nonliving object of vegetable matter within range: soft goods, rope, wood, or something similar. You can also use this spell to create mineral objects such as stone, crystal, or metal. The object created must be no larger than a 5-foot cube, and the object must be of a form and material that you have seen before. 

The duration depends on the object’s material. If the object is composed of multiple materials, use the shortest duration. 

| !Material | !Duration
|Vegetable matter | 1 day |
|Stone/crystal | 12 hours |
Precious metals | 1 hour |
Gems | 10 minutes |
Adamantine/Mithral | 1 minute |

Using any material created by this spell as another spell’s material component causes that spell to fail.
"""
''Hold Breath.'' The crocodile can hold its breath for <<time 15m>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d10+2>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 12>>). Until this grapple ends, the target is [[Restrained]], and the crocodile can’t bite another target. |<|
The typical crystal ball, a very rare item, is about 6 inches in diameter. While touching it, you can cast the [[Scrying]] spell (<<save "Spell DC" 17>>) with it.

The following crystal ball variants are legendary items and have additional properties.

[[Crystal Ball of Mind Reading]]. You can use an action to cast the [[Detect Thoughts]] spell (<<save "Spell DC" 17>>) while you are [[Scrying]] with the crystal ball, targeting creatures you can see within 30 feet of the spell’s sensor. You don’t need to concentrate on this [[Detect Thoughts]] to maintain it during its duration, but it ends if [[Scrying]] ends.

[[Crystal Ball of Telepathy]]. While scrying with the crystal ball, you can communicate telepathically with creatures you can see within 30 feet of the spell’s sensor. You can also use an action to cast the [[Suggestion]] spell (<<save "Spell DC" 17>>) through the sensor on one of those creatures. You don’t need to concentrate on this [[Suggestion]] to maintain it during its duration, but it ends if [[Scrying]] ends. Once used, the [[Suggestion]] power of the crystal ball can’t be used again until the next dawn.

[[Crystal Ball of True Seeing]]. While [[Scrying]] with the crystal ball, you have [[Truesight]] with a radius of 120 feet centered on the spell’s sensor.
This crystal ball is about 6 inches in diameter. While touching it, you can cast the [[Scrying]] spell (<<save "Spell DC" 17>>) with it.

You can use an action to cast the [[Detect Thoughts]] spell (<<save "Spell DC" 17>>) while you are scrying with the crystal ball, targeting creatures you can see within 30 feet of the spell's sensor. You don't need to concentrate on this [[Detect Thoughts]] to maintain it during its duration, but it ends if [[Scrying]] ends.
This crystal ball is about 6 inches in diameter. While touching it, you can cast the [[Scrying]] spell (<<save "Spell DC" 17>>) with it.

While scrying with the crystal ball, you can communicate telepathically with creatures you can see within 30 feet of the spell's sensor. You can also use an action to cast the [[Suggestion]] spell (<<save "Spell DC" 17>>) through the sensor on one of those creatures. You don't need to concentrate on this [[Suggestion]] to maintain it during its duration, but it ends if [[Scrying]] ends. Once used, the [[Suggestion]] power of the crystal ball can't be used again until the next dawn.
This crystal ball is about 6 inches in diameter. While touching it, you can cast the [[Scrying]] spell (<<save "Spell DC" 17>>) with it.

While [[Scrying]] with the crystal ball, you have [[Truesight]] with a radius of 120 feet centered on the spell's sensor.
This cube is about an inch across. Each face has a distinct marking on it that can be pressed. The cube starts with 36 charges, and it regains <<roll 1d20>> expended charges daily at dawn.

You can use an action to press one of the cube’s faces, expending a number of charges based on the chosen face, as shown in the [[Cube of Force Faces]] table. Each face has a different effect. If the cube has insufficient charges remaining, nothing happens. Otherwise, a barrier of invisible force springs into existence, forming a <<cube 15>> on a side. The barrier is centered on you, moves with you, and lasts for <<time 1m>>, until you use an action to press the cube’s sixth face, or the cube runs out of charges. You can change the barrier’s effect by pressing a different face of the cube and expending the requisite number of charges, resetting the duration.

If your movement causes the barrier to come into contact with a solid object that can’t pass through the cube, you can’t move any closer to that object as long as the barrier remains.

{{Cube of Force Faces}}

The cube loses charges when the barrier is targeted by certain spells or comes into contact with certain spell or magic item effects, as shown in the table below.

| !Spell or item | !Charges Lost |
|![[Disintegrate]] |<<roll 1d12>> |
|![[Horn of Blasting]] |<<roll 1d10>> |
|![[Passwall]] |<<roll 1d6>> |
|![[Prismatic Spray]] |<<roll 1d20>> |
|![[Wall of Fire]] |<<roll 1d4>> |
This cube is 3 inches across and radiates palpable magical energy. The six sides of the cube are each keyed to a different plane of existence, one of which is the Material Plane. The other sides are linked to planes determined by the DM.

You can use an action to press one side of the cube to cast the gate spell with it, opening a portal to the plane keyed to that side. Alternatively, if you use an action to press one side twice, you can cast the [[Plane Shift]] spell (<<save "Spell DC" 17>>) with the cube and transport the targets to the plane keyed to that side.

The cube has 3 charges. Each use of the cube expends 1 charge. The cube regains <<roll 1d3>> expended charges daily at dawn.
"""
''Dark Devotion.'' The fanatic has advantage on saving throws against being [[Charmed]] or [[Frightened]].
''Spellcasting.'' The fanatic is a 4th-level spell caster. Its spell casting ability is Wisdom (<<save "Spell DC" 11>>, <<casted "Spell Attack" +3>>). The fanatic has the following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Light]], [[Sacred Flame]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Command]], [[Inflict Wounds]], [[Shield of Faith]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Hold Person]], [[Spiritual Weapon]]
"""
<<divider>>
''Multiattack.'' The fanatic makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Dagger +4>>|<<piercing 1d4+2>> |<<reach 5>><br/><<range 20/60>> |
"""
''Dark Devotion.'' The cultist has advantage on saving throws against being [[Charmed]] or [[Frightened]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +3>>|<<slashing 1d6+1>> |<<reach 5>> |
Starting at 2nd level, your quick thinking and agility allow you to move and act quickly. You can take a bonus action on each of your turns in combat. This action can be used only to take the Dash, Disengage, or Hide action.
A creature you touch regains a number of hit points equal to 1d8 + your spellcasting ability modifier. This spell has no effect on undead or constructs.
Also at 3rd level, you learn how to use your wit to distract, confuse, and otherwise sap the confidence and competence of others. When a creature that you can see within 60 feet of you makes an attack roll, an ability check, or a damage roll, you can use your reaction to expend one of your uses of [[Bardic Inspiration]], rolling a Bardic Inspiration die and subtracting the number rolled from the creature’s roll. You can choose to use this feature after the creature makes its roll, but before the DM determines whether the attack roll or ability check succeeds or fails, or before the creature deals its damage. The creature is immune if it can’t hear you or if it’s immune to being [[Charmed]].
\define ability(label, value, modifier, saving)
<table style="width: 100px;">
<tr><td colspan="2" align="center" style="width: 75px; height: 78px;">$label$<br/><div style="font-size:x-large; font-weight: bold; width: 1.5em; height: 1.5em; padding-top: 0.3em;">$value$</div></td></tr>
<tr>
<td align="center">Mod</td><td align="center">$modifier$</td>
</tr>
<tr>
<td align="center">Save</td><td align="center">$saving$</td>
</tr>
</table>
\end

\define ability-value(label, value)
<$macrocall $name="ability" label=$label$ value=$value$ modifier={{Modifiers##$value$}} saving={{Modifiers##$value$}} />
\end

\define ability-field(label, field)
<$macrocall $name="ability-value" label=$label$ value={{$field$}} />
\end

\define stat(label1, value, label2, class="")
<table style="width: 100px; height: 100px; margin: 0px;" class="$class$">
<tr><td style="text-align: center; vertical-align: middle; height: 22px; border: none; font-size: 90%;">$label1$</td></tr>
<tr><td style="text-align: center; vertical-align: middle; height: 31px; border: none; font-size: x-large;">$value$</td></tr>
<tr><td style="text-align: center; vertical-align: middle; height: 22px; border: none; font-size: 90%;">$label2$</td></tr>
</table>
\end

\define box(field)
<$checkbox field="$field$" checked="Used" unchecked="" class="box" />
\end

\define skill(level)
<$reveal type="match" default="0" text="$level$">&#9675;&#9675;</$reveal><$reveal type="match" default="1" text="$level$">&#9673;&#9675;</$reveal><$reveal type="match" default="2" text="$level$">&#9673;&#9673;</$reveal>
\end

\define diceroll(title dice field)
<table><tr><th style="padding: 0;" colspan="2">$title$</th></tr>
<tr><td style="padding: 0;" align="center"><$button>
<$action-dice $dice="$dice$" $field="$field$" />
$dice$
</$button></td><td style="padding: 0px 5px 1px 5px;"><$view field="$field$" class="dice" /></td></tr></table>
\end

\define dicerollv(title dice field)
<table><tr><th style="padding: 0;" colspan="2">$title$</th></tr>
<tr><td style="padding: 0;" align="center"><$button>
<$action-dice $dice="$dice$" $field="$field$" $verbose=1 />
$dice$
</$button></td><td style="padding: 0px 5px 1px 5px;"><$view field="$field$" class="dice" /></td></tr></table>
\end

\define attack(prefix name damage_type tohit damage info)
<tr><th colspan="4">Deprecated function</th></tr>
\end

\define attack2(prefix name tohit damage1 damage2 info)
<tr><th colspan="4">Deprecated function</th></tr>
\end

\define dc(prefix name damage_type dc damage info)
<tr><th colspan="4">Deprecated function</th></tr>
\end

"""
''&lt;&lt;ability'' //label// //value// //modifier// //saving_throw//''&gt;&gt;'' - Display a single character ability score
''&lt;&lt;ability-value'' //label// //value//''&gt;&gt;'' - Display a single character ability score, modifiers are automatically calculated from value
''&lt;&lt;ability-field'' //label// //field//''&gt;&gt;'' - Display a single character ability score, with value is stored in a tiddler field
''&lt;&lt;statistic'' //top_label// //value// //bottom_label// //stylesheet class//''&gt;&gt;'' - Display a single character statistic
''&lt;&lt;box'' //field//''&gt;&gt;'' - Create a checkbox field
''&lt;&lt;skill'' //proficiency_level//''&gt;&gt;'' - <<skill 1>>
''&lt;&lt;diceroll'' //title 1d6 field//''&gt;&gt;'' - Roll dice 
''&lt;&lt;dicerollv'' //title 3d6 field//''&gt;&gt;'' - Roll dice, with detailed results
''&lt;&lt;attack'' //name damage_type tohit dmg_dice field_prefix info//''&gt;&gt;'' - Roll attack dice
''&lt;&lt;dc'' //name damage_type dc dmg_dice field_prefix info//''&gt;&gt;'' - Roll saving throw attack damage
"""
[data-tags*="Character"] .tc-tiddler-body {
 text-rendering: optimizeLegibility;
 -webkit-font-smoothing: antialiased;
}

[data-tags*="Character"] .tc-tiddlylink {
 font-weight: bold;
}

[data-tags*="Monster"] .tc-tiddler-body {
 text-rendering: optimizeLegibility;
 -webkit-font-smoothing: antialiased;
 width: 500px;
}

[data-tags*="Monster"] .tc-tiddlylink {
 font-weight: bold;
}

.dnd-effect {
 font-family: -apple-system, ~BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
 text-rendering: optimizeLegibility;
 -webkit-font-smoothing: antialiased;
}

.dnd-icon {
 vertical-align: sub;
 padding-left: 1px;
 padding-right: 1px;
}

.dnd-statbox {
 width: 98px;
 height: 98px;
 display: flex;
 flex-direction: column;
 background-size: contain;
 text-align: center;
 vertical-align: middle;
}

.dnd-statbox-label {
 display: block;
 box-sizing: inherit;
 outline: 0;
 font-weight: 700;
 font-size: 10px;
 text-transform: uppercase;
 line-height: 1;
}

.dnd-statbox-value {
 display: block;
 box-sizing: inherit;
 font-size: 26px;
 letter-spacing: -1px;
 box-sizing: inherit;
 outline: 0;
}

.tc-tiddler-frame .tc-tiddler-body h1, .tc-tiddler-preview-preview h1, .tc-tiddler-frame .tc-tiddler-body h2, .tc-tiddler-preview-preview h2, .tc-tiddler-frame .tc-tiddler-body h3, .tc-tiddler-preview-preview h3, .tc-tiddler-frame .tc-tiddler-body h4, .tc-tiddler-preview-preview h4, .tc-tiddler-frame .tc-tiddler-body h5, .tc-tiddler-preview-preview h5, .tc-tiddler-frame .tc-tiddler-body h6, .tc-tiddler-preview-preview h6 {
 line-height: normal;
 font-weight: bold;
}

.fold {
  font-weight: bold;
}

.unfold {
  font-weight: bold;
}

table.max {
  width: 100%;
}

table.top th {
  vertical-align: top;
}

table.top td {
  vertical-align: top;
}

table.noborder {
  border: 0px;
}

table.spelltable tr td:nth-child(1){
  width: 30%; /* Spell */
}
table.spelltable tr td:nth-child(2){
  width: 5%; /* Level */
}
table.spelltable tr td:nth-child(3){
  width: 15%; /* School */
}
table.spelltable tr td:nth-child(4){
  width: 10%; /* Casting time */
}
table.spelltable tr td:nth-child(5){
  width: 5%; /* Components */
}
table.spelltable tr td:nth-child(6){
  width: 17.5%; /* Range */
}
table.spelltable tr td:nth-child(7){
  width: 12.5%; /* Duration*/
}
table.spelltable tr td:nth-child(8){
  width: 5%; /* Meta */
}

label.box input[type=checkbox]
{
  -ms-transform: scale(1.5); /* IE */
  -moz-transform: scale(1.5); /* FF */
  -webkit-transform: scale(1.5); /* Safari and Chrome */
  -o-transform: scale(1.5); /* Opera */
  transform: scale(1.5);
  margin: 0.25em;
  width: 15px;
  height: 15px;
}

.padding {
  padding: 5px;
}

.gallery {
  display: flex; 
  flex-wrap: wrap; 
  width: 100%;
}

.icon {
  text-align: center;
  width:100px;
  padding: 5px;
}

.grid2 {
  display: grid; 
  grid-template-columns: 300px 300px; 
  grid-gap: 10px; 
  width: 610px;
}

.grid4 {
  display: grid; 
  grid-template-columns: 100px 100px 100px 100px; 
  grid-gap: 10px; 
  width: 430px;
}

.grid6 {
  display: grid; 
  grid-template-columns: 100px 100px 100px 100px 100px 100px; 
  grid-gap: 10px; 
  width: 650px;
}

.monster {
  background-repeat: repeat-x, repeat;
  box-shadow: 0 0 5px #979aa4;
  padding: 15px 15px 15px 15px;
  display: flex;
  flex-wrap: wrap;
  flex-direction: column;
  min-height: 400px;
  max-height: 700px;
}

.monster h1 {
  margin-block-start: 0px;
  font-weight: bold;
}

.monster div {
  width: 500px;
}

.btn-download {
  width: 250px; 
  padding: 10px;
  border-radius: 5px;
  background: #1462ff;
  border-radius: 5px;
  border: none;
  box-shadow: 0 2px 2px 0 #4a74c9;
  overflow: hidden;
  cursor: pointer;
  font-size: 1.2em;
  line-height: 1.4em;
  color: #fff;
  fill: #fff;
}

.btn-download:active {
  background: #1475ff;
}
You gain a +1 bonus to attack and damage rolls made with this magic weapon.

You can use an action to cause thick, black poison to coat the blade. The poison remains for <<time 1m>> or until an attack using this weapon hits a creature. That creature must succeed on a <<save Con 15>> or take <<poison 2d10>> and become [[Poisoned]] for <<time 1m>>. The dagger can’t be used this way again until the next dawn.
| !Tier | !Level | !Moderate | !Dangerous | !Deadly |
| !1 |!1-4 |<<damage 1d10>> |<<damage 2d10>> |<<damage 4d10>> |
| !2 |!5-10 |<<damage 2d10>> |<<damage 4d10>> |<<damage 10d10>> |
| !3 |!11-16 |<<damage 4d10>> |<<damage 10d10>> |<<damage 18d10>> |
| !4 |!17-20 |<<damage 10d10>> |<<damage 18d10>> |<<damage 24d10>> |
You create up to four torch-sized lights within range, making them appear as torches, lanterns, or glowing orbs that hover in the air for the duration. 
You can also combine the four lights into one glowing vaguely humanoid form of Medium size. Whichever form you choose, each light sheds dim light in a 10-foot radius. 

As a bonus action on your turn, you can move the lights up to 60 feet to a new spot within range. A light must be within 20 feet of another light created by this spell, and a light winks out if it exceeds the spell’s range.
You can use a bonus action to toss this magic sword into the air and speak the command word. When you do so, the sword begins to hover, flies up to 30 feet, and attacks one creature of your choice within 5 feet of it. The sword uses your attack roll and ability score modifier to damage rolls.

While the sword hovers, you can use a bonus action to cause it to fly up to 30 feet to another spot within 30 feet of you. As part of the same bonus action, you can cause the sword to attack one creature within 5 feet of it.

After the hovering sword attacks for the fourth time, it flies up to 30 feet and tries to return to your hand. If you have no hand free, it falls to the ground at your feet. If the sword has no unobstructed path to you, it moves as close to you as it can and then falls to the ground. It also ceases to hover if you grasp it or move more than 30 feet away from it.
At 2nd level, you gain an uncanny sense of when things nearby aren’t as they should be, giving you an edge when you dodge away from danger.

You have advantage on Dexterity saving throws against effects that you can see, such as traps and spells. To gain this benefit, you can’t be blinded, deafened, or incapacitated.
Starting at 1st level, when you reduce a hostile creature to 0 hit points, you gain temporary hit points equal to your Charisma modifier + your warlock level (minimum of 1).
Starting at 6th level, you can call on your patron to alter fate in your favor. When you make an ability check or a saving throw, you can use this feature to add a d10 to your roll. You can do so after seeing the initial roll but before any of the roll’s effects occur.

Once you use this feature, you can’t use it again until you finish a short or long rest.
"""
''Echolocation.'' The darkmantle can’t use its [[Blindsight]] while [[Deafened]].
''False Appearance.'' While the darkmantle remains motionless, it is indistinguishable from a cave formation such as a stalactite or stalagmite.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Crush +5>>|<<bludgeoning 1d6+3>> |<<reach 5>> |
|~|The darkmantle attaches to the target. If the target is Medium or smaller and the darkmantle has advantage on the attack roll, it attaches by engulfing the target’s head, and the target is also [[Blinded]] and unable to breathe while the darkmantle is attached in this way.<br/>&nbsp;<br/>While attached to the target, the darkmantle can attack no other creature except the target but has advantage on its attack rolls. The darkmantle’s speed also becomes 0, it can’t benefit from any bonus to its speed, and it moves with the target.<br/>&nbsp;<br/>A creature can detach the darkmantle by making a successful <<save Str 13>> as an action. On its turn, the darkmantle can detach itself from the target by using 5 feet of movement. |<|
| !Darkness Aura|''1/Day''<br/>A <<sphere 15>> of magical [[Darkness]] extends out from the darkmantle, moves with it, and spreads around corners. The darkness lasts as long as the darkmantle maintains concentration, up to 10 minutes (as if concentrating on a spell). Darkvision can’t penetrate this darkness, and no natural light can illuminate it. If any of the darkness overlaps with an area of light created by a spell of 2nd level or lower, the spell creating the light is dispelled. |<|

Magical darkness spreads from a point you choose within range to fill a 15-foot radius sphere for the duration.
The darkness spreads around corners. A creature with darkvision can’t see through this darkness, and nonmagical light can’t illuminate it.

If the point you choose is on an object you are holding or one that isn’t being worn or carried, the darkness emanates from the object and moves with it. Completely covering the source of the darkness with an opaque object, such as a bowl or a helm, blocks the darkness.

If any of this spell’s area overlaps with an area of light created by a spell of 2nd level or lower, the spell that created the light is dispelled.
You touch a willing creature to grant it the ability to see in the dark.
For the duration, that creature has darkvision out to a range of 60 feet.
Many creatures in fantasy gaming worlds, especially those that dwell underground, have darkvision. Within a specified range, a creature with darkvision can see in Dim Light as if it were bright light and in darkness as if it were dim light, so areas of darkness are only lightly obscured as far as that creature is concerned. However, the creature can’t discern color in that darkness, only shades of gray.
A 60-foot-radius sphere of light spreads out from a point you choose within range. 
The sphere is bright light and sheds dim light for an additional 60 feet. 

If you chose a point on an object you are holding or one that isn’t being worn or carried, the light shines from the object with and moves with it. Completely covering the affected object with an opaque object, such as a bowl or a helm, blocks the light. 

If any of this spell’s area overlaps with an area of darkness created by a spell of 3rd level or lower, the spell that created the darkness is dispelled.
R0lGODlh4QDhAKEBAAAAAP///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAADhAOEAAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsOi8fksvmMTqvX7Lb7DY/L5/S6/Y7P6/f8vv8PGCg4SFhoeIiYqLjI2Oj4CBkpOUlZqQKAmam5ydnp+QkaKqo5OWp6ipqamqja6vqqagg7S1u7SWibq9sauOv7OwoIPEx8y1eMTOyXzOx73Ayd+xxN/bpXjW2dl829ut0NLvodTu6JV47eeZfOTlrXDg/wHs8+T59Od98+p18v1+8PDkB8cQYSfMPMA7qCyUhwY4jMRDaBDU9UoxgRBTX+jMUuQeOozGNChBVTRCOZUWRJNiNVpmS5UmMzlB1XfHTT0uRMnDEt7myTU2ZQNUMl/oT5UmjPNEVLHEVa02VInkl9LmV61WFWNE1HPIU6VWlYqlGtVgU7TOdWrGdBnPy3VsNGfnEvXCxjEOCZvPq48o1H9G9AtoLDkS088TDityAX1/XruG3jyNKuUf5l+TKwcZoxr+uc1g7osRBHe6Zr+nTp1Lvysd4M97Wz2LJ10a5dmSbu3EAfWwCnO7TRub0lh7iLFrZU42O6av261/cHxoRJq5XOxflw5mG0O/UOBrxX6GTEi7hZXXgL9JDLsmAfnftz7FrMHyffnL5C/GLp7Lvl351+HcBnhn/TARiegBwQiJeCGzBYnoNyIfiFgftZiAWGD0KYn3zncdifhHZRF597YmloBYq/EZeecmaRWKJ1B3aT3G68tWdja2vkqFqLPM5S3I+1KCakNjUW6U2QSLoS3JKoTOZkMFBGCcptVIZi5ZWfZKmlOqt1aQ6XYGKC2phefmkmmWWmqeaaaX72JpxgZnblH1QOYqMleu7JZ59+/glooIIOSmihhh6KaKKKLspoo44+Cmmkkk5KaaWWXopppppuymmnnn4Kaqiijkpqqaaeimqqqq7KaquuvgprrLLOSqsiBQAAOw==
A deafened creature can't hear and automatically fails any ability check that requires hearing.
"""
''Two-Headed.'' The dog has advantage on Wisdom (Perception) checks and on saving throws against being [[Blinded]], [[Charmed]], [[Deafened]], [[Frightened]], [[Stunned]], or knocked [[Unconscious]].
"""
<<divider>>
''Multiattack.'' The dog makes two bite attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Con 12>> against disease or become [[Poisoned]] until the disease is cured. Every <<time 24h>> that elapse, the creature must repeat the saving throw, reducing its hit point maximum by <<damage 1d10>> on a failure. This reduction lasts until the disease is cured. The creature dies if the disease reduces its hit point maximum to 0. |<|
You touch a creature and grant it a measure of protection from death. 
The first time the target would drop to 0 hit points as a result of taking damage, the target instead drops to 1 hit point, and the spell ends. If the spell is still in effect when the target is subjected to an effect that would kill it instantaneously without dealing damage, that effect is instead negated against the target, and the spells ends.
This stoppered flask sloshes when shaken, as if it contains water. The decanter weighs 2 pounds.

You can use an action to remove the stopper and speak one of three command words, whereupon an amount of fresh water or salt water (your choice) pours out of the flask. The water stops pouring out at the start of your next turn. Choose from the following options:

* “Stream” produces 1 gallon of water.
* “Fountain” produces 5 gallons of water.
* “Geyser” produces 30 gallons of water that gushes forth in a geyser 30 feet long and 1 foot wide. As a bonus action while holding the decanter, you can aim the geyser at a creature you can see within 30 feet of you. The target must succeed on a <<save Str 13>> or take <<bludgeoning 1d4>> and fall [[Prone]]. Instead of a creature, you can target an object that isn’t being worn or carried and that weighs no more than 200 pounds. The object is either knocked over or pushed up to 15 feet away from you.
This box contains a set of parchment cards. A full deck has 34 cards. A deck found as treasure is usually missing <<roll 1d20-1>> cards.

The magic of the deck functions only if cards are drawn at random (you can use an altered deck of playing cards to simulate the deck). You can use an action to draw a card at random from the deck and throw it to the ground at a point within 30 feet of you.

An illusion of one or more creatures forms over the thrown card and remains until dispelled. An illusory creature appears real, of the appropriate size, and behaves as if it were a real creature (as presented in the Monster Manual), except that it can do no harm. While you are within 120 feet of the illusory creature and can see it, you can use an action to move it magically anywhere within 30 feet of its card. Any physical interaction with the illusory creature reveals it to be an illusion, because objects pass through it. Someone who uses an action to visually inspect the creature identifies it as illusory with a successful DC <<investigation 15>>. The creature then appears translucent.

The illusion lasts until its card is moved or the illusion is dispelled. When the illusion ends, the image on its card disappears, and that card can’t be used again.

| !Playing Card | !Illusion |
|!Ace of hearts |<<mob "Red Dragon">> |
|!King of hearts |<<mob Knight>> and four <<mob Guard>> |
|!Queen of hearts |<<mob "Succubus/Incubus">> |
|!Jack of hearts |<<mob Druid>> |
|!Ten of hearts |<<mob "Cloud Giant">> |
|!Nine of hearts |<<mob Ettin>> |
|!Eight of hearts |<<mob Bugbear>> |
|!Two of hearts |<<mob Goblin>> |
|!Ace of diamonds |<<mob Beholder>> |
|!King of diamonds |<<mob Archmage>> and <<mob Mage>> apprentice |
|!Queen of diamonds |<<mob "Night Hag">> |
|!Jack of diamonds |<<mob Assassin>> |
|!Ten of diamonds |<<mob "Fire Giant">> |
|!Nine of diamonds |<<mob "Ogre Mage">> |
|!Eight of diamonds |<<mob Gnoll>> |
|!Two of diamonds |<<mob Kobold>> |
|!Ace of spades |<<mob Lich>> |
|!King of spades |<<mob Priest>> and two <<mob Acolytes>> |
|!Queen of spades |<<mob Medusa>> |
|!Jack of spades |<<mob Veteran>> |
|!Ten of spades |<<mob "Frost Giant">> |
|!Nine of spades |<<mob Troll>> |
|!Eight of spades |<<mob Hobgoblin>> |
|!Two of spades |<<mob Goblin>> |
|!Ace of clubs |<<mob "Iron Golem">> |
|!King of clubs |<<mob "Bandit Captain">> and three <<mob Bandit>> |
|!Queen of clubs |<<mob Erinyes>> |
|!Jack of clubs |<<mob Berserker>> |
|!Ten of clubs |<<mob "Hill Giant">> |
|!Nine of clubs |<<mob Ogre>> |
|!Eight of clubs |<<mob Orc>> |
|!Two of clubs |<<mob Kobold>> |
|!Jokers (2) |You (the deck's owner)  |
Usually found in a box or pouch, this deck contains a number of cards made of ivory or vellum. Most (75 percent) of these decks have only thirteen cards, but the rest have twenty-two.

Before you draw a card, you must declare how many cards you intend to draw and then draw them randomly (you can use an altered deck of playing cards to simulate the deck). Any cards drawn in excess of this number have no effect. Otherwise, as soon as you draw a card from the deck, its magic takes effect. You must draw each card no more than <<time 1h>> after the previous draw. If you fail to draw the chosen number, the remaining number of cards fly from the deck on their own and take effect all at once.

Once a card is drawn, it fades from existence. Unless the card is the Fool or the Jester, the card reappears in the deck, making it possible to draw the same card twice.

| !Playing Card | !Card |
|!Ace of diamonds |Vizier* |
|!King of diamonds |Sun |
|!Queen of diamonds |Moon |
|!Jack of diamonds |Star |
|!Two of diamonds |Comet* |
|!Ace of hearts |The Fates* |
|!King of hearts |Throne |
|!Queen of hearts |Key |
|!Jack of hearts |Knight |
|!Two of hearts |Gem* |
|!Ace of clubs |Talons* |
|!King of clubs |The Void |
|!Queen of clubs |Flames |
|!Jack of clubs |Skull |
|!Two of clubs |Idiot* |
|!Ace of spades |Donjon* |
|!King of spades |Ruin |
|!Queen of spades |Euryale |
|!Jack of spades |Rogue |
|!Two of spades |Balance* |
|!Joker (with TM) |Fool* |
|!Joker (without TM) |Jester |
|* Found only in a deck with twenty-two cards |<|f

''Balance.'' Your mind suffers a wrenching alteration, causing your alignment to change. Lawful becomes chaotic, good becomes evil, and vice versa. If you are true neutral or unaligned, this card has no effect on you.

''Comet.'' If you single-handedly defeat the next hostile monster or group of monsters you encounter, you gain experience points enough to gain one level. Otherwise, this card has no effect.

''Donjon.'' You disappear and become entombed in a state of suspended animation in an extradimensional sphere. Everything you were wearing and carrying stays behind in the space you occupied when you disappeared. You remain imprisoned until you are found and removed from the sphere. You can’t be located by any divination magic, but a wish spell can reveal the location of your prison. You draw no more cards.

''Euryale.'' The card’s medusa-like visage curses you. You take a −2 penalty on saving throws while cursed in this way. Only a god or the magic of The Fates card can end this curse.

''The Fates.'' Reality’s fabric unravels and spins anew, allowing you to avoid or erase one event as if it never happened. You can use the card’s magic as soon as you draw the card or at any other time before you die.

''Flames.'' A powerful devil becomes your enemy. The devil seeks your ruin and plagues your life, savoring your suffering before attempting to slay you. This enmity lasts until either you or the devil dies.

''Fool.'' You lose 10,000 XP, discard this card, and draw from the deck again, counting both draws as one of your declared draws. If losing that much XP would cause you to lose a level, you instead lose an amount that leaves you with just enough XP to keep your level.

''Gem.'' Twenty-five pieces of jewelry worth 2,000 gp each or fifty gems worth 1,000 gp each appear at your feet.

''Idiot.'' Permanently reduce your Intelligence by <<roll 1d4+1>> (to a minimum score of 1). You can draw one additional card beyond your declared draws.

''Jester.'' You gain 10,000 XP, or you can draw two additional cards beyond your declared draws.

''Key.'' A rare or rarer magic weapon with which you are proficient appears in your hands. The DM chooses the weapon.

''Knight.'' You gain the service of a 4th-level fighter who appears in a space you choose within 30 feet of you. The fighter is of the same race as you and serves you loyally until death, believing the fates have drawn him or her to you. You control this character.

''Moon.'' You are granted the ability to cast the [[Wish]] spell <<roll 1d3>> times.

''Rogue.'' A nonplayer character of the DM’s choice becomes hostile toward you. The identity of your new enemy isn’t known until the NPC or someone else reveals it. Nothing less than a wish spell or divine intervention can end the NPC’s hostility toward you.

''Ruin.'' All forms of wealth that you carry or own, other than magic items, are lost to you. Portable property vanishes. Businesses, buildings, and land you own are lost in a way that alters reality the least. Any documentation that proves you should own something lost to this card also disappears.

''Skull.'' You summon an avatar of death—a ghostly humanoid skeleton clad in a tattered black robe and carrying a spectral scythe. It appears in a space of the DM’s choice within 10 feet of you and attacks you, warning all others that you must win the battle alone. The avatar fights until you die or it drops to 0 hit points, whereupon it disappears. If anyone tries to help you, the helper summons its own avatar of death. A creature slain by an avatar of death can’t be restored to life.

''Star.'' Increase one of your ability scores by 2. The score can exceed 20 but can’t exceed 24.

''Sun.'' You gain 50,000 XP, and a wondrous item (which the DM determines randomly) appears in your hands.

''Talons.'' Every magic item you wear or carry disintegrates. Artifacts in your possession aren’t destroyed but do vanish.

''Throne.'' You gain proficiency in the Persuasion skill, and you double your proficiency bonus on checks made with that skill. In addition, you gain rightful ownership of a small keep somewhere in the world. However, the keep is currently in the hands of monsters, which you must clear out before you can claim the keep as yours.

''Vizier.'' At any time you choose within one year of drawing this card, you can ask a question in meditation and mentally receive a truthful answer to that question. Besides information, the answer helps you solve a puzzling problem or other dilemma. In other words, the knowledge comes with wisdom on how to apply it.

''The Void.'' This black card spells disaster. Your soul is drawn from your body and contained in an object in a place of the DM’s choice. One or more powerful beings guard the place. While your soul is trapped in this way, your body is incapacitated. A wish spell can’t restore your soul, but the spell reveals the location of the object that holds it. You draw no more cards.
"""
''Optional Class Feature''
"""

You train yourself to use a variety of weapons as monk weapons, not just simple melee weapons and shortswords. Whenever you finish a short or long rest, you can touch one weapon, focus your ki on it, and then count that weapon as a monk weapon until you use this feature again.

The chosen weapon must meet these criteria:

* The weapon must be a simple or martial weapon.
* You must be proficient with it.
* It must lack the heavy and special properties.
"""
''Stone Camouflage.'' The gnome has advantage on Dexterity (Stealth) checks made to hide in rocky terrain.
''Gnome Cunning.'' The gnome has advantage on Intelligence, Wisdom, and Charisma saving throws against magic.
''Innate Spellcasting.'' The gnome’s innate spellcasting ability is Intelligence (<<save "Spell DC" 11>>). It can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Nondetection]] (self only)
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Blindness/Deafness]], [[Blur]], [[Disguise Self]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "War Pick" +4>>|<<piercing 1d8+2>> |<<reach 5>> |
| !<<ranged "Poisoned Dart" +4>>|<<piercing 1d4+2>> |<<range 30/120>> |
|~|Target must succeed on a <<save Con 12>> or be [[Poisoned]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +2>>|<<piercing 1d4>> |<<reach 5>> |
You gain a +3 bonus to attack and damage rolls made with this magic weapon.

The first time you attack with the sword on each of your turns, you can transfer some or all of the sword’s bonus to your Armor Class, instead of using the bonus on any attacks that turn. For example, you could reduce the bonus to your attack and damage rolls to +1 and gain a +2 bonus to AC. The adjusted bonuses remain in effect until the start of your next turn, although you must hold the sword to gain a bonus to AC from it.
While you are wearing armor, you gain a +1 bonus to AC.
At 7th level, you gain one of the following features of your choice.

''Escape the Horde.'' Opportunity attacks against you are made with disadvantage.

''Multiattack Defense.'' When a creature hits you with an attack, you gain a +4 bonus to AC against all subsequent attacks made by that creature for the rest of the turn.

''Steel Will.'' You have advantage on saving throws against being frightened.
Starting at 3rd level, you can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by 1d10 + your Dexterity modifier + your monk level.

If you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 [[Ki]] point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet.

"""
''Replaces the [[Natural Explorer]] feature''
"""

You are an unsurpassed explorer and survivor, both in the wilderness and in dealing with others on your travels. You gain the Canny benefit below, and you gain an additional benefit below when you reach 6th level and 10th level in this class.

!!! ''Canny (1st Level).''
 
Choose one of your skill proficiencies. Your proficiency bonus is doubled for any ability check you make that uses the chosen skill.

You can also speak, read, and write two additional languages of your choice.

!!! ''Roving (6th Level)''

Your walking speed increases by 5, and you gain a climbing speed and a swimming speed equal to your walking speed.

!!! ''Tireless (10th Level)''

As an action, you can give yourself a number of temporary hit points equal to 1d8 + your Wisdom modifier (minimum of 1 temporary hit point). You can use this action a number of times equal to your proficiency bonus, and you regain all expended uses when you finish a long rest.

In addition, whenever you finish a short rest, your [[Exhaustion]] level, if any, is decreased by 1.
A beam of yellow light flashes from your pointing finger, then condenses to linger at a chosen point within range as a glowing bead for the duration. 
When the spell ends, either because your concentration is broken or because you decide to end it, the bead blossoms with a low roar into an explosion of flame that spreads around corners. Each creature in a 20-foot-radius sphere centered on that point must make a Dexterity saving throw. A creature takes fire damage equal to the total accumulated damage on a failed save, or half as much damage on a successful one. 

The spell’s base damage is 12d6. If at the end of your turn the bead has not yet detonated, the damage increases by 1d6. 

If the glowing bead is touched before the interval has expired, the creature touching it must make a Dexterity saving throw. On a failed save, the spell ends immediately, causing the bead to erupt in flame. On a successful save, the creature can throw the bead up to 40 feet. When it strikes a creature or a solid object, the spell ends, and the bead explodes. 
The fire damages objects in the area and ignites flammable objects that aren’t being worn or carried.&nbsp;
You create a shadowy door on a flat solid surface that you can see within range. 
The door is large enough to allow Medium creatures to pass through unhindered. When opened, the door leads to a demiplane that appears to be an empty room 30 feet in each dimension, made of wood or stone. When the spell ends, the door disappears, and any creatures or objects inside the demiplane remain trapped there, as the door also disappears from the other side. 

Each time you cast this spell, you can create a new demiplane, or have the shadowy door connect to a demiplane you created with a previous casting of this spell. Additionally, if you know the nature and contents of a demiplane created by a casting of  this spell by another creature, you can have the shadowy door connect to its demiplane instead.
While wearing this armor, you gain a +1 bonus to AC, and you can understand and speak Abyssal. In addition, the armor’s clawed gauntlets turn unarmed strikes with your hands into magic weapons that deal slashing damage, with a +1 bonus to attack rolls and damage rolls and a damage die of 1d8.

''Curse.'' Once you don this cursed armor, you can’t doff it unless you are targeted by the remove curse spell or similar magic. While wearing the armor, you have disadvantage on attack rolls against demons and on saving throws against their spells and special abilities.
| !Druid Level | !Spells |
| !3rd |[[Blur]], [[Silence]] |
| !5th |[[Create Food and Water]], [[Protection from Energy]] |
| !7th |[[Blight]], [[Hallucinatory Terrain]] |
| !9th |[[Insect Plague]], [[Wall of Stone]] |
Starting at 5th level, when an undead fails its saving throw against your [[Turn Undead]] feature, the creature is instantly destroyed if its challenge rating is at or below a certain threshold, as shown in the Destroy Undead table.

| !Cleric Level | !Destroys Undead of CR ... |
| !5th | 1/2 or lower |
| !8th | 1 or lower |
| !11th | 2 or lower |
| !14th | 3 or lower |
| !17th | 4 or lower |
{{Destroy Undead}}
{{Destroy Undead}}
{{Destroy Undead}}
{{Destroy Undead}}
For the duration, you know if there is an aberration, celestial, elemental, fey, fiend, or undead within 30 feet of you, as well as where the creature is located. Similarly, you know if there is a place or object within 30 feet of you that has been magically consecrated or desecrated. 

The spell can penetrate most barriers, but it is blocked by 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or 3 feet of wood or dirt.
For the duration, you sense the presence of magic within 30 feet of you. If you sense magic in this way, you can use your action to see a faint aura around any visible creature or object in the area that bears magic, and you learn its school of magic, if any. 

The spell can penetrate most barriers, but is blocked by 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or 3 feet of wood or dirt.
For the duration, you can sense the presence and location of poisons, poisonous creatures, and diseases within 30 feet of you. You also identify the kind of poison, poisonous creature, or disease in each case. 

The spell can penetrate most barriers, but is blocked by 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or 3 feet of wood or dirt.
For the duration, you can read the thoughts of certain creatures. 
When you cast the spell and as your action on each turn until the spell ends, you can focus your mind on any one creature that you can see within 30 feet of you. If the creature you choose has an Intelligence of 3 or lower or doesn’t speak any language, the creature is unaffected. 

You initially learn the surface thoughts of the creature—what is most on its mind in that moment. As an action, you can either shift your attention to another creature’s thoughts or attempt to probe deeper into the same creature’s mind. If you probe deeper, the target must make a Wisdom saving throw. If it fails, you gain insight into its reasoning (if any), its emotional state, and something that looms large in its mind (such as something it worries over, loves, or hates). If it succeeds, the spell ends. Either way, the target knows that you are probing into its mind, and unless you shift your attention to another creature’s thoughts, the creature can use its action on its turn to make an Intelligence check contested by your Intelligence check; if it succeeds, the spell ends. 

Questions verbally directed at the target creature naturally shape the course of its thoughts, so this spell is particularly effective as part of an interrogation. 

You can also use this spell to detect the presence of thinking creatures you can’t see. When you cast the spell or as your action during the duration, you can search for thoughts within 30 feet of you. The spell can penetrate barriers, but 2 feet of rock, 2 inches of any metal other than lead, or a thin sheet of lead blocks you. You can’t detect a creature with an Intelligence of 3 or lower or one that doesn’t speak any language. 

Once you detect the presence of a creature in this way, you can read its thoughts for the rest of the duration as described above, even if you can’t see it, but it must still be within range.
"""
''Angelic Weapons.'' The deva’s weapon attacks are magical. When the deva hits with any weapon, the weapon deals an extra <<radiant 4d8>> (included in the attack).
''Innate Spellcasting.'' The deva’s spellcasting ability is Charisma (spell save DC 17). The deva can innately cast the following spells, requiring only verbal components:
//At will:// [[Detect Evil and Good]]
//1/day each:// [[Commune]], [[Raise Dead]]
''Magic Resistance.'' The deva has advantage on saving throws against spells and other magical effects.
"""
[img[divider.png]]
''Multiattack.'' The deva makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Mace +8>>|<<bludgeoning 1d6+4>> + <<radiant 4d8>> |<<reach 5>> |
| !Healing Touch|''3/Day''<br/>The deva touches another creature. The target magically regains <<heal 4d8+2>> and is freed from any curse, disease, poison, blindness, or deafness. |<|
| !Change Shape|The deva magically polymorphs into a humanoid or beast that has a challenge rating equal to or less than its own, or back into its true form. It reverts to its true form if it dies. Any equipment it is wearing or carrying is absorbed or borne by the new form (the deva’s choice).<br/>&nbsp;<br/>In a new form, the deva retains its game statistics and ability to speak, but its AC, movement modes, Strength, Dexterity, and special senses are replaced by those of the new form, and it gains any statistics and capabilities (except class features, legendary actions, and lair actions) that the new form has but that it lacks. |<|
You can see normally in darkness, both magical and nonmagical, to a distance of 120 feet.
Beginning at 14th level, your mastery of [[Ki]] grants you proficiency in all saving throws.

Additionally, whenever you make a saving throw and fail, you can spend 1 [[Ki]] point to reroll it and take the second result.

The travel speeds given in the [[Travel Pace Table]] assume relatively simple terrain: roads, open plains, or clear dungeon corridors. But adventurers often face dense forests, deep swamps, rubble-filled ruins, steep mountains, and ice-covered ground-all considered
difficult terrain.

You move at half speed in difficult terrain-moving 1 foot in difficult terrain costs 2 feet of speed-so you can cover only half the normal distance in a minute. an hour, or a day.
You teleport yourself from your current location to any other spot within range. You arrive at exactly the spot desired. It can be a place you can see, one you can visualize, or one you can describe by stating distance and direction, such as "200 feet straight downward" or "upward to the northwest at a 45-degree angle, 300 feet".

You can bring along objects as long as their weight doesn’t exceed what you can carry. You can also bring one willing creature of your size or smaller who is carrying gear up to its carrying capacity. The creature must be within 5 feet of you when you cast this spell. 

If you would arrive in a place already occupied by an object or a creature, you and any creature traveling with you each take 4d6 force damage, and the spell fails to teleport you.
You can use an action to place these shackles on an incapacitated creature. The shackles adjust to fit a creature of Small to Large size. In addition to serving as mundane manacles, the shackles prevent a creature bound by them from using any method of extradimensional movement, including teleportation or travel to a different plane of existence. They don’t prevent the creature from passing through an interdimensional portal.

You and any creature you designate when you use the shackles can use an action to remove them. Once every <<time 30d>>, the bound creature can make a <<athletics 30>>. On a success, the creature breaks free and destroys the shackles.
"""
''Price:'' 39 gp
1 Chest
2 Cases for Maps and Scrolls
1 Set of Fine Clothes
1 Bottle of Ink
1 Ink Pen
1 Lamp
2 Flasks of Oil
5 Sheets of Paper
1 Vial of Perfume
1 Sealing Wax
1 Soap
"""
"""
''Keen Hearing and Smell.'' The wolf has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pack Tactics.'' The wolf has advantage on an attack roll against a creature if at least one of the wolf's allies is within 5 feet of the creature and the ally isn't incapacitated.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +5>>|<<piercing 2d6+3>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Str 13>> or be knocked [[Prone]]. |<|
Also starting at 1st level, your healing spells are more effective. Whenever you use a spell of 1st level or higher to restore hit points to a creature, the creature regains additional hit points equal to 2 + the spell’s level.

<<vtabs "[tag[Disease]sort[]]">>
Some giant rats carry vile diseases that they spread with their bites. A diseased giant rat has a challenge rating of 1/8 (25 XP) and the following action instead of its normal bite attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d4+2>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Con 10>> or contract a disease. Until the disease is cured, the target can’t regain hit points except by magical means, and the target’s hit point maximum decreases by <<damage 1d6>> every <<time 24h>>. If the target’s hit point maximum drops to 0 as a result of this disease, the target dies. |<|

This pouch of cosmetics, hair dye, and small props lets you create disguises that change your physical appearance. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to create a visual disguise.

The perfect tool for anyone who wants to engage in trickery, a disguise kit enables its owner to adopt a false identity.

''Components.'' A disguise kit includes:

* cosmetics
* hair dye
* small props
* a few pieces of clothing

''Deception.'' In certain cases, a disguise can improve your ability to weave convincing lies.

''Intimidation.'' The right disguise can make you look more fearsome, whether you want to scare someone away by posing as a plague victim or intimidate a gang of thugs by taking the appearance of a bully.

''Performance.'' A cunning disguise can enhance an audience’s enjoyment of a performance, provided the disguise is properly designed to evoke the desired reaction.

''Persuasion.'' Folk tend to trust a person in uniform. If you disguise yourself as an authority figure, your efforts to persuade others are often more effective.

''Create Disguise.'' As part of a long rest, you can create a disguise. It takes you 1 minute to don such a disguise once you have created it. You can carry only one such disguise on you at a time without drawing undue attention, unless you have a bag of holding or a similar method to keep them hidden. Each disguise weighs 1 pound.

At other times, it takes 10 minutes to craft a disguise that involves moderate changes to your appearance, and 30 minutes for one that requires more extensive changes.

| !Activity | !DC |
|!Cover injuries or distinguishing marks | 10 |
|!Spot a disguise being used by someone else | 15 |
|!Copy a humanoid’s appearance | 20 |
You make yourself &mdash; including your clothing, armor, weapons, and other belongings on your person &mdash; look different until the spell ends or until you use your action to dismiss it. 

You can seem 1 foot shorter or taller and can appear thin, fat, or in between. You can’t change your body type, so you must adopt a form that has the same basic arrangement of limbs. Otherwise, the extent of the illusion is up to you. 

The changes wrought by this spell fail to hold up to physical inspection. For example, if you use this spell to add a hat to your outfit, objects pass through the hat, and anyone who touches it would feel nothing or would feel your head and hair. If you use this spell to appear thinner than you are, the hand of som eone who reaches out to touch you would bump into you while it was seemingly still in midair. To discern that you are disguised, a creature can use its action to inspect your appearance and must succeed on an Intelligence (Investigation) check against your spell save DC.
A thin green ray springs from your pointing finger to a target that you can see within range. 
The target can be a creature, an object, or a creation of magical force, such as the wall created by wall of force. 

A creature targeted by this spell must make a Dexterity saving throw. On a failed save, the target takes 10d6 + 40 force damage. If this damage reduces the target to 0 hit points, it is disintegrated. 

A disintegrated creature and everything it is wearing and carrying, except magic items, are reduced to a pile of fine gray dust. The creature can be restored to life only by means of a true resurrection or a wish spell. 

This spell automatically disintegrates a Large or smaller nonmagical object or a creation of magical force. If the target is a Huge or larger object or creation of force, this spell disintegrates a 10-foot-cube portion of it. A magic item is unaffected by this spell.&nbsp;
Shimmering energy surrounds and protects you from fey, undead, and creatures originating from beyond the Material Plane. For the duration, celestials, elementals, fey, fiends, and undead have disadvantage on attack rolls against you. 

You can end the spell early by using either of the following special functions. 

<b>Break  Enchantment.</b>&nbsp;
As your action, you touch a creature you can reach that is [[Charmed]], [[Frightened]], or possessed by a celestial, an elemental, a fey, a fiend, or an undead. The creature you touch is no longer charmed, frightened, or possessed by such creatures. 

<b>Dismissal.</b>&nbsp;
As your action, make a melee spell attack against a celestial, an elemental, a fey, a fiend, or an undead you can reach. On a hit, you attempt to drive the creature back to its home plane. The creature must succeed on a Charisma saving throw or be sent back to its home plane (if it isn’t there already). If they aren’t on their home plane, undead are sent to the Shadowfell, and fey are sent to the Feywild.
Choose any creature, object, or magical effect within range. Any spell of 3rd level or lower on the target ends. For each spell of 4th level or higher on the target, make an ability check using your spellcasting ability. The DC equals 10 + the spell’s level. On a successful check, the spell ends.&nbsp;
When you cast a spell that has a range of 5 feet or greater, you can spend 1 sorcery point to double the range of the spell.

When you cast a spell that has a range of touch, you can spend 1 sorcery point to make the range of the spell 30 feet.
iVBORw0KGgoAAAANSUhEUgAAAfQAAAAKCAYAAABCOaxXAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wcfDB8AIh6vrwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAN1klEQVR42u2bbYxmZXnH/9d1n/O8zc7uvCDsSnRZsq2AwBbRxtiqSXehgksCVokWNSRt00RoBWOB7UYTNASFRJvatH5q+0H9IMV0WRcWNmijYjBRGsJuABGWSlVQZ4adnZ2d55z7vi4/3C/nPjOzi21oGuO5kmeeM+c55zznfv39r/99HqCLLrrooosuuviND4obT9y/b0JVGSIGUKiAAWUVYQUYqlCAVYRbF1D/PxEJAECFnUghqiwiBTPbnz3yvT9//Tv/8B9IlceLi2c99q9f/sqO66/74MKPnnvHDw88cPslH77ug89/65Ebjx19/q2nu1nN/lKzM90PEQkI4j+ndINEpLG46T7zY5odkn0Zk4bTVDm8U9oGoOF4TXflr3n+Ve/eu/miC/cTkSBcQ1VZoQylWA4+RYPI6tZREEAQSu/xw6xGFJzugSAgEl8fJEQAgQTQVvlbdQcCMVlKdUBQFa6tHdjajqq6GpqNG35xyTUfePF0bXT0wAN9XzoSZVhHgIRXHhfsepd2w6+LLrro4lUG+ucvvXTOLi3NQATkBFAFRABRqDioE6gI1PltqESAgkEwRDCFARMBClRVhaquUdc1SmNQlgXKsgdxDnVdY1yN4Zwgw9UqaP8PlAhRAjMRgajZXrPPAzGelq5Cay4aKZ2AHrSKQFUTQbWBddomAIVhlKaAKUw6T1Qh4RxN71l5CCBiEJMvExGIOeynlqARad8XCGD4czmcy8StbVD4LFVALnooAj18l39XVYgInBM458ATI4xef/aT4qRUkQISBEEmAtAukyjABBIwBARpBAVFkQOAm3Zhcr6dvADxookgUUgRACJhIiFmy8yWiIRB4j+Lgg6g2E4Ax20B+Lxrr71BnOs9dc89X9h62a67pn/3Dd+YO/zE7qnt279VTkzMIfaTIBApCJ9476kMQWRtf9fuuptKuuiii/93oD996CAduOEm8QBvgK7OASKQAHFxDmL9C+rnTmaCYYOCDUxhYNhDRJyDcwJxNsDBw0PUg0Gcg4gEZmqL4r820BOLAoQobvOpge7p2AB0LYDytDgAMwN3Arp/qTSfq2gCLBv2cDYJXFDyaNFcL1AjJBLAmT0Cw//IgG6dhXUO1loPdfV3y4ZQcIGiMDDGpP3BVUHyJwKsGy6GGohAp1VAj2VTQMQzTEIdxPdYTbqm5ajdRlGosN8pQSRY55pzGVBq2iRtU9YvMkEW5QnF+4/lApJ44Wxf7qaINq3BzDBFgcIYIN5f6JdKmupGY5miUJAg0kTD8XqKHhzqnBlbLr30m8VwcIwIQmABAXJyvPHky3Ov27B5y5H1zqdVQiiUg5W8shYoqyo7KESkcKrF1qvf/beD6akXer3eiR273tMJji5S/OehA6Wtqglb24GKFINef6nf7x1/42VXul/3Go8/sH9iXFUTdW1HYcIREAkUHEX1cNg79qYrrjmen/fYg18bWuf6ftyRi45gEvdKpKrsEz2FBiHvh5d6t7iZYUSTy0iAUuNSAuj1B8fLsly+eOeVvzVuID196CDd/5EAdBdekgHdOqizDdBdBnRiFMakbLRghjEcKl8gTiHiwrZARKEqCYAeGJIlwvqKFKdVRH9FoDMncLWBnmXrWdaaT8GaZ+jaAD29JIif+HmAhDcqUpbXEIXIQ4oCzKk5hpi9EFidoXNw+6E4OR5jZWUFKytjuCCICEDPFBgM+hj0+yiLAlBNwsm7K7qmbhMEKRc/3BZCaNeXxnpThQBtt2F123FbSPmyBLcA3sVZGY8xHq94cUBN+3ix0xY/a0AXgM4BthzhHdqawWF/A/4W0KM4A1D2SvQHA/QHfbDxrooT8f1WAdFYh7EPqxet4rwwES9O1Emqj/Xqmg178WAMmPxYYTZgzh0VBnM4fnVbZAsteR0J1C9rhH4iBLjQNoKwPxOPWOViNftCmzGtVs3p/Nlztz0ye+653/HX9kIiiDcBqYhoISKFihTI7pqYrO8WfhmoGWNgVWEVfy0CYMpi5QN//88fj/W379O3/OWWCy/Y//vXXP/T/+sJ8eEv3HnlcHLypbddf+MP7tl7063vu+PvPnv4wFcnHz/04CeIjSU2FgSBwpddfQ7jy0SwzvWcdQPnXM+psIoUCsCYoirKYqUsi2XDpg6i0TiRImQLrFBIWML0cIuuVJP0qAbxJtKLECQQVo4tbfn500/tjA5SEKHacpWUWst8quBcKauuXoMEtHUOrSNU86zEu2kgUhCEmCW5XEQC5mabSIjJhglIiMmB2YIA0yuXNkxPvbA4v7AtG0NCTLYoe8sbp6d+DAWR+IU9UmVSBQkxKdI+FmU4LSBasCr88WBSJYgWpACpMlThzwtOXJ4AhHtVZlFDFkxOmUQNWxAJ/D4Bs1VmAZNVw06NsTBklWFh2CoR1Jhq8/Zt/zH30s/fOK6qDcWgt/jarVsffXlhYSsxydQZr3k6jJVmjDC55GNTyjN517UfempdRD710P3m6zfcbH2F+Jc/S0CqgFNvsYuCVKACkIpPEUJnSmzSZg7Q8M0uZOPiXGvij9t+YkWC1mlTdWpPkgnyGdBB7az2dECnVV47ZZNdy2pPGflaoOs6QE+3T9n9BVArZZlqBm8QgU2Y0MPET8yZNa9gNiGTLBwxWyYSFWWxtm9tDVfXsNZ5i18EGoCjTlqQoQg5agM9QrAtlKi1jcz+z4EuWL2EsFpoUYIwEaEoChRlibIsxuQHsuQKXL1dn3UHbdn74TpCgMYJjNNkBgllkVBWaZo0+47wqq3tW2sHta1LL5Q0lU9EIRrrMwBdFKLBZQrZuYbPVdd23og1Dn2Rg9jx/zNM2O8dLm4fh7VOUhI6YYCLX5pIQM+3JTtu7RycC9m1LlYupJVa/8dSBoOHFAHYdW3Lqq5g6yotDcXyELUds+heRcdORLzjVxgUZc8/UOIc6nHlRRUapygtNTGHPurrLdYpmSCS43czuzhZUliuISJRAFVdj6q6NlVd+USGGFwWUOdgyiKJ2NVjIQJTVI3X8IThaDg3HA7nh8PRAhuuFArrpGetHdR1PaxtPbLWDUSFI5xDv6TYP9FkpZxNjrxOgiNEJKYsx8PJDS8GYaUglvRMDNg3FOfPzlAShpT1p9edf9HXXzjyxNW/85a3/sv0WWcdefwbh27bsevyO3u9waJCWbL+TEyW2NgoGDxwNI05ABBSUfhnqQxTZQpTE7P1dQ+/DBeXrpTC8ptiMLHhFxddfk39/X1fPlOS4FEGkYw2Tv7swp1Xd8/fnCrnffKh+82+G2+yjJjZxHeACVqAhInFgMQwWUMs5BdyjVjXc9aVYj1IxFqIs8gTFBXnJ8VVk10D9AzypwC6rgP1VlbdAjq1gB6h2ZqsaO3aegI+M8rRCPWJE1BVmF4fbjxu28zaZGm9DRv8NXXtuni8N7E1nHXoT05ARFEvLwNMGGzcCOcsZFyhnBjFyUONKSrDZJlIlo8tTpajUU3MMjkczm2amHhpambm2YnJyZeorgfOSnli6fjm+fn5c+d/Obf9+NISeNBvsrkcNNqe03OhEx2XvE44g3jMrHOHIVnuUAgke5qvATcI4AAAUSEowMy6aWrTf81MTx+dnpl5rj/oLxJIrLiehoGLsP4eB3wGpBbQk3pXYv/sXbakECBDoAaCHugIE4s4kWJxcfHs+YWFbfMLC9uWTy7PQpTBLEQkEh7wVFVWEdO4HdrADprW61uVkHfZ1spS8xxGdEaQgE5gJqdODOoaIEI5Gp7Mr2erakhs1NmaiuHgZAR6tXRimNwfNEs8us6SxfoZVxvueYdpiSuiU4rtJIBUMrPm9ECPAjTBOj7vEBIBJwLJ5pHsCdT03Ed0gSLQwWuA3n4PMFbyz2eoKklMUb3g1gj+/AFT0+udLMresgcaWSJScVp6Z45lZnbquemZ2WdnZ894ptfvHSfDtq6q4dLSic3zLy+cs7Dw8raxrQc7Lr/iU6YsxjEpVhGDKM6C5awqHEEe/BZWBZhJyrI8yVxWCoNNm19z5M1XvX++w1kXhTLJmAEDwDApE4shEhiumNiRMVVhipXSFFVpzLg0RcUgUXGFq6qJ8Uq1sRqvTKq1fWct6nHVthy1yDJdrLFopWUHSxqrZ15w/nOvveTie33HRmZDRaUazk9Wj7cgkf3fWCbNmksYmGg/3BQsKmY3mp0+unPPJ790cO+tHwWAs3/v4ntf+P5j1/kJXYuwZs6qSmyKevfdn7vjlSr5yQf2DX/5zLPvfPtff+wgANz3NzfvLUej+Stuv+OfDt9379Tz3330L3Z/5u671zv323fd+d6337Ln3+L/h/bcenMxNfWTt9y656sP793zV2LdAIrDmwjYpMDEmWc887aP3/LvXdf+zY+De2/76Gh25ug7PnbLfa31y699ZfOO9/zpi4/84+d3/sFHbn447n/o05/4M6nrQevXGmG9fe3VFSFHKpTVSnttEizplx1Zdt7+VUXjA2fbUKD1S5I4vqL+YcmMMdGYlUaxJVogZK9z//2TN5X93uJoZvrHqkoabO7mm4JUC3a3t3W93atEoiCmCGNmm/+Sg71gtRzOBUPiw5sEbmzjJBq9nXz5bbd/6VVp3P3f7Dp4F69+hg4AX3z/n+z/6eEju5lIt5x33oOz52x9lJktg8QwW2O4MsRimCtjTM0AVIXEup4NP2s657I/uuuCP76qe/imiy666KKLLrrooosuuuiiiy7+N/ErWYalCuSuxBwAAAAASUVORK5CYII=
Your magic and an offering put you in contact with a god or a god’s servants. You ask a single question concerning a specific goal, event, or activity to occur within 7 days. The DM offers a truthful reply. The reply might be a short phrase, a cryptic rhyme, or an omen. 

The spell doesn’t take into account any possible circumstances that might change the outcome, such as the casting of additional spells or the loss or gain of a companion. 

If you cast this spell two or more times before finishing your next long rest, there is a cumulative 25 percent chance for each casting after the first that you get a random reading. The DM makes this roll in secret.
In a pantheon, every deity has influence over different aspects of mortal life and civilization, called a deity’s domain. All the domains over which a deity has influence are called the deity’s portfolio. For example, the portfolio of the Greek god Apollo includes the domains of Knowledge, Life, and Light. As a cleric, you choose one aspect of your deity’s portfolio to emphasize, and you are granted powers related to that domain.

Your choice might correspond to a particular sect dedicated to your deity. Apollo, for example, could be worshiped in one region as Phoebus (“radiant”) Apollo, emphasizing his influence over the Light domain, and in a different place as Apollo Acesius (“healing”), emphasizing his association with the Life domain. Alternatively, your choice of domain could simply be a matter of personal preference, the aspect of the deity that appeals to you most.

Each domain’s description gives examples of deities who have influence over that domain. Gods are included from the worlds of the Forgotten Realms, Greyhawk, Dragonlance, and Eberron campaign settings, as well as from the Celtic, Greek, Norse, and Egyptian pantheons of antiquity.

Choose one domain related to your deity: [[Knowledge|Knowledge Domain]], [[Life|Life Domain]], [[Light|Light Domain]], [[Nature|Nature Domain]], [[Tempest|Tempest Domain]], [[Trickery|Trickery Domain]], or [[War|War Domain]]. The [[Life Domain]] is detailed at the end of the class description and provides examples of gods associated with it. See the Player’s Handbook for details on all the domains.

!!! Domain Spells

Each domain has a list of spells — its domain spells — that you gain at the cleric levels noted in the domain description. Once you gain a domain spell, you always have it prepared, and it doesn’t count against the number of spells you can prepare each day.

If you have a domain spell that doesn’t appear on the cleric spell list, the spell is nonetheless a cleric spell for you.
Your prayer empowers you with divine radiance. Until the spell ends, your weapon attacks deal and extra 1d4 radiant damage on a hit.
By 3rd level, the divine magic flowing through you makes you immune to disease.
Beginning at 10th level, you can call on your deity to intervene on your behalf when your need is great.

Imploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The DM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.

If your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.

At 20th level, your call for intervention succeeds automatically, no roll required.
{{Divine Intervention}}
The presence of strong evil registers on your senses like a noxious odor, and powerful good rings like heavenly music in your ears. As an action, you can open your awareness to detect such forces. Until the end of your next turn, you know the location of any celestial, fiend, or undead within 60 feet of you that is not behind total cover. You know the type (celestial, fiend, or undead) of any being whose presence you sense, but not its identity (the vampire Count Strahd von Zarovich, for instance). Within the same radius, you also detect the presence of any place or object that has been consecrated or desecrated, as with the hallow spell.

You can use this feature a number of times equal to 1 + your Charisma modifier. When you finish a long rest, you regain all expended uses.
Starting at 2nd level, when you hit a creature with a melee weapon attack, you can expend one spell slot to deal radiant damage to the target, in addition to the weapon’s damage. The extra damage is 2d8 for a 1st-level spell slot, plus 1d8 for each spell level higher than 1st, to a maximum of 5d8. The damage increases by 1d8 if the target is an undead or a fiend, to a maximum of 6d8.

| !Slot | !Normal<br/>Damage | !Undead/Fiend<br/>Damage |
| !1st | <<radiant 2d8>> | <<radiant 3d8>> |
| !2nd | <<radiant 3d8>> | <<radiant 4d8>> |
| !3rd | <<radiant 4d8>> | <<radiant 5d8>> |
| !4th | <<radiant 5d8>> | <<radiant 6d8>> |
You utter a divine word, imbued with the power that shaped the world at the dawn of creation. 
Choose any number of creatures you can see within range. Each creature that can hear you must make a Charisma saving throw. On a failed save, a creature suffers an effect based on its current hit points: 

*  50 hit points or fewer: [[Deafened]] for 1 minute 
*  40 hit points or fewer: [[Deafened]] and [[Blinded]] for 10 minutes 
*  30 hit points or fewer: [[Blinded]], [[Deafened]], and [[Stunned]] for 1 hour 
*  20 hit points or fewer: killed instantly 

Regardless of its current hit points, a celestial, an elemental, a fey, or a fiend that fails its save is forced back to its plane of origin (if it isn’t there already) and can’t return to your current plane for 24 hours by any means short of a wish spell.
"""
''Elemental Demise.'' If the djinni dies, its body disintegrates into a warm breeze, leaving behind only equipment the djinni was wearing or carrying.
''Innate Spellcasting.'' The djinni’s innate spellcasting ability is Charisma, <<skillcheck "Save DC" 17>>, <<casted "Spell To-Hit" +9>>. It can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Evil and Good]], [[Detect Magic]], [[Thunderwave]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Create Food and Water]] (can create wine instead of water), [[Tongues]], [[Wind Walk]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Conjure Elemental]] (<<mob "Air Elemental">> only), [[Creation]], [[Gaseous Form]], [[Invisibility]], [[Major Image]], [[Plane Shift]]
"""
<<divider>>
''Multiattack.'' The djinni makes three scimitar attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +9>>|<<slashing 2d6+5>>+(<<lightning>>/ <<thunder 1d6>>) |<<reach 5>> |
| !Create Whirlwind|A <<cylinder 5>>, 30-foot-tall cylinder of swirling air magically forms on a point the djinni can see within <<range 120>> of it. The whirlwind lasts as long as the djinni maintains concentration (as if concentrating on a spell). Any creature but the djinni that enters the whirlwind must succeed on a <<save Str 18>> or be [[Restrained]] by it. The djinni can move the whirlwind up to <<range 60>> as an action, and creatures [[Restrained]] by the whirlwind move with it. The whirlwind ends if the djinni loses sight of it.<br/>&nbsp;<br/>A creature can use its action to free a creature [[Restrained]] by the whirlwind, including itself, by succeeding on a <<skillcheck Str 18>>. If the check succeeds, the creature is no longer [[Restrained]] and moves to the nearest space outside the whirlwind. |<|
//Winter's Splendor is a two-hour festive adventure for 1st to 4th level characters. It was published by Wizards of the Coast in December 2018 as an Adventurer's League module.//

THE DM notes you see here are intended to be used as a quick reference tool while running the adventure. Everything about the adventure has been organized and condensed into short and concise bullet notes. 

Should the DM forget something while running the adventure, they can easily look up what they need without wasting much time.

* Each major section of the adventure is in a single page.
** Short bullet prompts, annotated with colored icons, are used to highlight important information.
** Where necessary, large sections are broken into sub-sections to reduce information overload.
* For each combat encounter, monster stat-blocks are included for easy reference
* Images such as maps and other pictures are external links.
** This reduces the size of the wiki greatly.
<<htabs "[tag[DM Tool]sort[order]]">>
These are tools that help the DM generate random stuff at the table.

<<vtabs "[tag[DM Tool]sort[]]">>
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvcLAAwCfcSi0SBMKpfDo/OpYkqnSaj1uqFqt02s96vgisXg8nWMJpvXvrRbzY7X3nS4/M6q6+34/mgPyOc3mBVoqEWYmHHIuKX4KNEoSQVZyTCJKWW5GZDpqcmp+Dm6FEpIilplipfaGrQq5yoLALs2O1sLdnubi7W722v1yxvsNAxcXHT8m9y2zNy88wwdjTM9XH1zfZw9t03dDfPNHS4+Dl6+ck6err6O3m7yzh4vPw9fH3JPn6+/j9+Pwz9+AQUOBFgQw0GECSssxNaw0ENiERdNpFjRwkX+hhkbbETWkcJHjCEjjMRVMtJJlCkfrGTZ0uNLVzFdzmxV08FNnDkv7UTV0+fPUUF/DCVaFMFRoEmRLEXa9CnUpFI/NXVaFdPVTlm1Xu3qNSpYSVu5jjVU1uxZQGnXoi3rNlDbuHvm0q1j9+6bvHrTpFXbV5DYwGP+AiaM6C/iwoYXOzJ82LESyJElC6Fc2TLmzJI3W2aymTPi0KIJky6t9zTqu6pXu23tei3s2GBn0+5q+7bU3Lqf8u499DdW1sKB3yw+/DXy5GOXK5Xt/IDy6Mx3U3+e9XqYqtqNLu0u9Cd4mTvH6zxu3ubI9Co3sp/g/r3Ig/IvDKxvcR1+g9v+9n+Y5p8IEAX4hywEKkUCKQnCdlkJk9jThWeqnFAXCpNJeKELoL2wIWRTrPJhY5RwkhhcXFQiWE9oPLLiYC32sVdReLFCR1BssXFjTIeUsWNLZJ3RSEqZPDFkR1PxcGRBPFmTSkUGerOkkiC1wFE3AFL4TED6dbBlPBOFd5+XnylIAy3qyTBmkzG8ol6E7qTJFJUNnjdhCnDS9Oac5GWI5Z1x9sknmIEK6GeUhIZI54j+FGqoBye2WaKjjDYq0WOJPsrfpGpmiumejOWnKaXz+QXpixqFiuepNZbqhkOoPglfhZfOaNKrqULw1qx64GorrJ7K+muO3vW66XZBspr+awLEFovdj7oyIuiyPQ77ILLHUivtrtE6G2xYxmYbI7ZFPjvut+B22uyf2yZZ3bmDtsuuslOm6y6b5t66LrP0StutqPvCxNe84gps4zW89lcwwuQOqOM4Byts3GjSOWwtw/xO/M3DBmPc678E3Zslx7Z6zHC+4FwMb8kD04NyxOWaPGXL52h8ZcqMklzlzCK/ijPB8ma8M6o9k7SyxcsODXDRJx8d9DI0h2xzoUj7CjNGMlO88NLETo2v0jEzHTXRIDvdtKZc+1u20VunnTPWLgd2tr5jswz229Vm/fXaYSc9t9ods+1z3H9eDTTeVtets+EwEQ5x1Ysj7rbjvjL+vrHik0NeeL9+jwy42D9DTHnNmmv9995Ue3243nZzK/mtoUM9et6lr35t7KnPnrjtj6uee+tRvk625a5j3jjqu+MeufGX855836RzbnrXzssOPe3QVvw8z53z/Xnl1sclOJnC/068974XC/zH3YuevsrT315978oPz3zm5w9evuj3i//9dP3LhT3qaS96aCMg+vIHu/1NpX1tyxwDA7e95SHPfrojX/30VyvYPbCAAcTfBasUKwEKLYLeAoEIQxU+AELIghPkoAlZGD8XFoh/G0yWOaxCwjGl8FPaKFcNV4Wku/3vLDtUFBG49UMeHuF6BtRMDiMlDBUOsTlP7JBMGYCVRCvGgVZTrE0V7eWHcHURN19EkamyaCYSdeqHvbDUGLPTuWYYkYFWsmL62lGKLzqGXlKKEOOclMY3cmdiNWnZgQ6JyEQqMpEFAAA7
<<vtabs "[tag[DnD]sort[order]]">>
@font-face {
  font-family: 'dndicon';
  src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAKogAAsAAAAAqdQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIGxWNtYXAAAAFoAAAAlAAAAJS94noLZ2FzcAAAAfwAAAAIAAAACAAAABBnbHlmAAACBAAApBAAAKQQvz5W02hlYWQAAKYUAAAANgAAADYdBtUFaGhlYQAApkwAAAAkAAAAJAjCBRZobXR4AACmcAAAAVQAAAFURHEIcWxvY2EAAKfEAAAArAAAAKymI9GsbWF4cAAAqHAAAAAgAAAAIAB4A/huYW1lAACokAAAAW4AAAFu44J7uXBvc3QAAKoAAAAAIAAAACAAAwAAAAMD6AGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6bMDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAHgAAAAaABAAAwAKAAEAIOku6TLpQOlO6VDpa+lx6ZTps//9//8AAAAAACDpAOkw6TTpQulQ6WvpcemU6bP//f//AAH/4xcEFwMXAhcBFwAW5hbhFr8WoQADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAMABP/AAwUDwABFAHgArwAABS4BJyYnLgEnJicuATU8AT8CPgE3PgE3PgE3PgE3PgEzMhYXHgEXHgEXHgEXHgEfAhYGBwYHDgEHBgcOAQcOASMiJic3PgE3PgE3PgE3PgEvAi4BJy4BLwEHDgEHDgEPAgYVHAEVFhUWFx4BFxYXHgEzMDY3Jy4BJy4BJyYnPAE1NjU/AT4BNz4BNz4BNz4BMzIWFx4BFx4BHwIWFAcGBw4BBwYHDgEjIiYnAUk0MB8jHh0uEBAKCAQBARUXXiYSNRMTJwgIFAYGCgEBDQgIFAcGJBJITh8SJggVAQIDBwkRETAgHycYOCwYIgEBIxhnKSwdDiwNJzIKAwEBAR8NIgsTTlY5IBmBNxImChYBAQEGEhE5KCcxDFkDGhFRRWQiFBgEAQEBAR8NHQYHLxobNw0NFQEBIRUWQhgZNQ0fAQECBg8PMSIiKw9LAwEWDyMaHhocICFHJycpIS08HoM9lAYIHgwGEQYGDQIDBgICAwQCAwYDAgsGFxkKBgwDB5zDaiUtKSpMIiMfEiIWDBERDDUUHBYLLA8tcT8TaYifCgQLBAYZGxMKCCoSBQ0DB206MjJNGBkHNTIxWCcmHwcuDAkmJFw8IlApBxsbTzExMk4LBAkCAg8JCBIEBQYKBwcVCAgRBApYg4gRLysrTSIhHQooCwcAAAACAAEAPwP/A0QAHAA5AAABBgcOAQcGBw4BFREUFjc2Nz4BNzY3PgE1ETQmBwUmJy4BJyYnJgYVERQWFxYXHgEXFhcWNjURNCYnA8MkNDRxODgtBgccDi42NmovMCEWHyMZ/hQtODhxNDQkGSMfFiEwL2o2Ni4PGwcGA0QCBQUWEhEbBAwH/YkPDwcWDw8SBQQCAR8VAkoXIAJgGxESFgUFAgIgF/22FR8BAgQFEg8PFgcPDwJ3BwwEAAAAAAEAAP/ABAADwAAcAAABFwEnJgYVERQWMyEyNi8BARcWNjURNCYjISIGFwJFWf4qWB9RJhsBTCsiH1kB1lgfUSYb/rQrIh8DUFj+KlkfIiv+tBsmUR9YAdZZHyIrAUwbJlEfAAADAAD/yAK1A7gAEwA1AEsAADcUFh8BHgE7ATI2NzE3PgE1MTUhAxQWFx4BFxwBMSEwNjU+ATc+ATU0Jy4BJyYjIgcOAQcGFSUiBhUUBiMiJjU0Nz4BNzYzMhYVFAa9BgUhCRwQeREbCSIEBv7FvS4oGEAPATsBDkAYKC4bG18/P0hMPz9cGhoBW0FdEg0NExIRPCgoLg0SEjkJEgczDQ8PDTMHEglMAdlCdS0cZzEBAQEBMWccLXVCR0A/XhsbHRxgPj9EnVxBDhISDi0oKDwSERINDhIAAAACAAD/3AL1A7kAHwArAAAFJicuAScmNTQ3PgE3NjMyFx4BFxYVFAcOAQcGBwYiJxMyNjU0JiMiBhUUFgFUa0NCSg0NHh5nRURPTkVFZx4dDA1KQkNrDjIOJ0FdXUFBXV0km15deywsOU9ERWceHh4eZ0VETzksLHtdXpsVFQHEXUFBXV1BQV0ABgAAABUEAANuACoATABwAIIAngC0AAAlLgEnLgEnLgEnLgEnLgE1MDIzOgExFAYHDgEHDgEHDgEHDgEHDgEVBiYnNz4BNz4BNz4BNz4BNz4BNzAyOwEHBgcOAQcGBw4BMSI2NycmJy4BJyYnJjI7ARceARcWFx4BFxYXFhceARcWFx4BFQYmJwEnNz4BPwEzBxQGBw4BIwYiJzMiJjEwNjc+ATc+ATc0NjMfAR4BFSIjIgYjIiclJicuAScmMTQyMx8BHgEXFgYjIiY1Af4BCgcHFgkJDwICDgkfJWhJSWgJBwYQBQQSCQgXCAgYCQkNAQEBHQIJBQUYCwwXBRIdCQUIAV5Cn0k5PT1qJygNDxcBAgJCBUpLrUhIAQFAYKAFAg0GCAwLFwoJAwQJChUICQIBAgEIBv63kC4SJggU4AEMBwgMAQEsfNoOEwcFBAwDAwUBKmWPFAgMAS4udTY2DwFcAQYGDwYGQi9wPxomAQEtcF1AGAImGRhSISE4BwY1HnKHAQEhGBc6ERJCHR1VHh5YIB8vAQEBAyQGIxESViwrVBBDaiEUGwFdSE5NhzEyERQcCQcDB15e3FtbAgETBy4ZGysqVCIjDAwiI00gIAYFCAEBCgcCaAFFHToMHgMCOicnOQIBASIYGDgQEBgBAgEBYik6AQEBAgEeH0keHwEBYCg6AQIBAQEAAAAEAAD/wAUAA8AADwA1AEUAVQAAASMiBh0BFBY7ATI2PQE0JichFTM1IRUzNTQmIyE1MzI2PQE0JiMhIgYdARQWOwEVISIGHQEzBSMiBh0BFBY7ATI2PQE0JiEjIgYdARQWOwEyNj0BNCYBAMAbJSUbwBslJUsBgGABgGAtIP5tUBslJRv/ABslJRtQ/m0gLWACEMAbJSUbwBslJQHFwBslJRvAGyUlAQAlG8AbJSUbwBsloGBgYHMgLYAlG8AbJSUbwBslgC0gc0AlG8AbJSUbwBslJRvAGyUlG8AbJQAAAAIAAP/CAZUDwgAMACsAABMyFhUUBiMiJjU0NjMTIw4BJyMiBhURFBY7AREUFjsBMjY1ETMyNjURNCYjyzhPTzg4T084ZRgkUSUYKjweFSIdFYcVHiIVHTsqA8JLNTVLSzU1S/7gEAEROCj+8BQc/vATHR0TARAcFAEQKDgAAAAAAwAk/8MDGwO9ADIAZgBrAAAXJy4BJyY2Nz4BNzYmIyImLwE0Njc+ATMhHgEXHgEVBw4BIyIGFx4BFx4BFxYGBw4BByETPgEzPwE2JicuAScuAScuATc+ATE0JiMiBhUwFhcWBgcOAQcOARUUFhceARcWFxY2NzY3EzUhFSFbDAEYEisagChBBBMZGxQMAQEEBwUOCQFVBw4FBQcBAQwUGxkTBUAoUTkIBQ0hFx4E/qBwHmEuaQcJAw4HQCYnQgkTEQgCBDUmJjUEAggREwhDJ00wDgUCIRUZKSpfMDAlYv7HATk9PQOCV9dXRhUnBhZEIztMCA8FBQYBBQYFDwdMOyNEFgYnFSwyJBVWpHGIAwF9BQUBKTArEAgpFRUpCBI8GQkPAQEBAQ8JGTwSCCkVKisdFFEFAggEBQIBAQMEBQIUNGgACAAYACcD/wNCABEAHQAuADoARgBSAF4AagAAASMWBg8BFRQWMyEyNjURNCYjAyImNTQ2MzIWFRQGAwEmIgcBBhQXARYyNwE2NCcFIiY1NDYzMhYVFAYXIiY1NDYzMhYVFAYnIiY1NDYzMhYVFAYnIiY1NDYzMhYVFAYXIiY1NDYzMhYVFAYDs74PDR3aLSABZh8tLR+zEBcXEBAWFlr+6BdBF/7pFxcBFxdBFwEYFxf95BAWFhAQFha9EBcXEA8XFw8QFxcQDxcXDxAXFxAPFxe9EBYWEBAWFgImI08c2kogLS0gAWYfLf7aFxAPFxcPEBcBKwEXFxf+6RdBF/7oFxcBGBdBF14WEBAWFhAQFs0XEA8XFw8QF80WEBAWFhAQFswXEBAWFhAQF8wWEBAWFhAQFgAEAAD/wAP/A74AMgA+AGMAcQAABQ4BKwElLgEnLgE3JzM1Jzc+ATc+ATc+ASEgFhceARcVIxEcAR0BFAYHDgEHDgEHDgEHJT4BPQEjFRQWMzI2JT4BNxEhJy4BJy4BIyIGBw4BFRcVFwcOAQcGFjczFzYWNz4BNxM0Ji8BISIGFx4BHwEhAw0LIQ8e/szdXRAcHwYBoQECAgUJBhYJEWcBAQECZxEbFwNrBQMDCAkIGw0MIQ79hAoGbBwaChQCygcBA/3qBQIECwcUCgoUBwgKAQECAQUCBESo70MPJQ4PFAZ3BgsQ/uDLUwQCBQEEAk89AgECAQUKEDMyUfuTp3Q7EAkWBgoDAwoQNDJR/lFCIRBuDx4LDBkLCxQGBQQBRAoVFyUlIiUJKQwbDQKOSyQXCwgJCQgGDwWPmre6THQFCAQBAQECBwcaCwMdFxUKEQQIBR8SKgAAAAIAAP/OA/IDwAArAEcAACUnLgErAT4BNTQnLgEnJiMiBw4BBwYVFBceARcWMzI2NxUUFh8BFjI/ATY0JSInLgEnJjU0Nz4BNzYzMhceARcWFRQHDgEHBgPyxwcSCSEpLyEgcUxMVlZMTHEgISEgcUxMVkiDNQcHxw4oDjkO/aA1Ly5GFBQUFEYuLzU1Ly5GFBQUFEYuL0vHBwc1g0hWTExxICEhIHFMTFZWTExxICEvKSEJEgfHDg45DijjFBRGLi81NS8uRhQUFBRGLi81NS8uRhQUAAAAAAUABf/DA/cB5QA+AE4AXgCGAKsAABcuAScmNjc+ATc+ATc+ARcUBgcOARUUFhceASEgNjU0Jy4BJyYnLgE1NhYXHgEXHgEXHgEHDgEHBgcGBCMiJzc+ATc2MhceARcWBiMiJjchPgE3NjIXHgEXFgYjIiY3Jy4BJyYiBw4BBw4BMSI3PgE3NjM+ATc+ATMyFhceAR8BFRQGIzAmJzc1Nz4BNzYWFx4BFxYXHgEXFiMwJicuAScmIgcOAQcOATEwJjUiCQ8FBgYQCBUHEAgGBhQDEAwdEwMCBHcBWAF7XgUEEAoKDAgLAhUFBwcQBxUIEQUKAwgDA5WV/pqXlgdcAzcTHFUgFz4EAVVIRFgBAc4DPhcgVhsTNwQBWURIVQJ3GUAaHlwaFzcYChABDAweDQ0BEzYeFRYbGBgMFDISEQEBEAk7Dw82FC1nMhoNAgIMDBwLCwEPCxc4FxdaHBs+Gw0TATwCCQgKME0lZiJOHAgHDAIBVjyPZQYCBwIEAQMMAhkZUTU1PCk6AQENBggbTyJmJVAzCgMGAQEBAQEBTwMTBQYGBRMDAQICAQMTBQYGBRMDAQICARYLFAYGBQUTCwUGPj6VPj4OGAgGAwMDBhgNDcVRcwYFucQNCxsFDA4ZDAsJBz09jTo6BgULEwUFBQUTDAYHc1EAAAMAEP/QA/ADsAAbADcATQAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJgMiJy4BJyY1NDc+ATc2MzIXHgEXFhUUBw4BBwY3Jy4BNRE0NjsBMhYVERceAQ8BDgEnAgBnWlqHJycnJ4daWmdnWlqHJycnJ4daWmdTSUlsIB8fIGxJSVNTSUlsIB8fIGxJSSmqBQUOCkAKDoYIAwYmBhMIA7AnJ4daWmdnWlqHJycnJ4daWmdnWlqHJyf8gB8gbElJU1NJSWwgHx8gbElJU1NJSWwgH9F7BAoGAUgKDg4K/uViBRQINAgDBgAABQAA/8AEAAPAACAAKQBLAF8AbwAAASIGBwEOARURFBYXAR4BMyEyNjcBPgE1ETQmJwEuASMhFyEBEQEhAREBFyoBMQ4BByIGFxYXHgEXFhczNjc+ATc2Ny4BIy4BJyoBIxUeARcGBw4BBwYHJicuAScmJz4BFxE2Nz4BNzYxBicuAScmMQE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAMAXgBCv72/oj+9gEKuwECQ4xIBAcBAhUUSzQ1QwZDNTRLFBUCAQcESYxCAQEBQIhGAxQTRTExPT4xMUUTFANGiEFaMDArAwMmKSpFFxYDwAQE/uUECwb+cAYKBf7lBAQEBQEaBQoGAZAGCgUBGwQEOv72/oj+9gEKAXgBCrIWGQMGBXNeX40uLRERLi2OXl9yBQYDGRYXFRgEa1lZhSsrEBArK4VZWWsEGA7+DCVMS5k5OQEHBxEIBwAAAAAIAAD/wAQAA8AAIAApADQASQBeAHMAiACWAAABIgYHAQ4BFREUFhcBHgEzITI2NwE+ATURNCYnAS4BIyEXIQERASEBEQEXDwEXBzcXJzcvAQciBgcOAR8BHgEzMjY3PgEvAS4BIyEiBg8BBhYXHgEzMjY/ATYmJy4BIxMiBgcGFh8BHgEzMjY3NiYvAS4BIyEiBg8BDgEXHgEzMjY/AT4BJy4BIwUiBhUHFBYzMjY1NzYmATgGCgX+5QQEBAQBGwQLBgGQBgoFARsEBAQE/uUECwb+cAwBeAEK/vb+iP72AQq8VP7JSNHRSMn+VMEFCAQKBAciBQ0HBAoECgQIIgQOBwGCBw4EIggECgQKBAcNBSIHBAoECAVAChAEBAwMNgMFAgkRAwQMDDYCBQL9/gIEAzYMDAQDEQkDBAM2DAwEBBAKAQENEQISDA0SAQESA8AEBP7lBAsG/nAGCgX+5QQEBAUBGgUKBgGQBgoFARsEBDr+9v6I/vYBCgF4AQpV/Aei/5eX/6IH/EsDAwcZCi4GBwMDCBkKLgYGBgYuChkIAwMHBi4KGQcDA/6lCwoMFgQSAQELCgwWBBIBAQEBEgQWDAoLAQESBBYMCgu6Eg06DRERDToNEgAABQAA/8AEAAPAACAAKQBGAFIAcQAAASIGBwEOARURFBYXAR4BMyEyNjcBPgE1ETQmJwEuASMhFyEBEQEhAREBEyIHDgEHBgcWFx4BFxYzMjc+ATc2NyYnLgEnJiMVMhYVFAYjIiY1NDYXIgYVFBYzMjY1NCYnHAEVFAYjIiY1NDYzOgEzLgEjATgGCgX+5QQEBAQBGwQLBgGQBgoFARsEBAQE/uUECwb+cAwBeAEK/vb+iP72AQq8NjQ0XignGxsnKF40NDY2NjdgJyYWFiYnYDc2Nj1XVz09V1c9LD8/LCw/CQcVDg8UFA8BAgENHhEDwAQE/uUECwb+cAYKBf7lBAQEBQEaBQoGAZAGCgUBGwQEOv72/oj+9gEKAXgBCv7/EBE3IyQmJyMkNhEQEBE2JCMnJiQjNxEQMVc9PVdXPT1XKT8sLD8/LA8dDAEBAQ4VFQ4PFAkKAAAEAAD/wAQAA8AAIAApAFwAaQAAASIGBwEOARURFBYXAR4BMyEyNjcBPgE1ETQmJwEuASMhFyEBEQEhAREBFyIGBw4BFx4BFxYXHgEXFjEwNjc1IzUzNTMVMz4BNzYmJzUuAScmBw4BBwYxMCYnKgEjBRUjFTMVMzUzNSM1IwE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAMAXgBCv72/oj+9gEKIRIpFi4oKQwhEiIlJT4VFFY1W1xsGQEBAR8LGwgTCjcrLDsPEEpFAQICATlcXDlcXDkDwAQE/uUECwb+cAYKBf7lBAQEBQEaBQoGAZAGCgUBGwQEOv72/oj+9gEKAXgBCsENDR2NSxYsFCMfHiwMDTYsKGxcXAEDATlxJgELEgchCAgtGRhlAtJcOF1dOFwAAwAA/8AEAAPAACAAKQBkAAABIgYHAQ4BFREUFhcBHgEzITI2NwE+ATURNCYnAS4BIyEXIQERASEBEQEXFgcOAQcGFxYmNw4BFx4BFx4BNyoBIyYnJjY3NjcGFhc0NjcWBgc2Nz4BJyYnHgEHBiY3NjU2JicmJwE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAMAXgBCv72/oj+9gEKvw4iIlQfIBMbWyAcDhALOhoeSCgBAgEwFhYBFhYoEwsZGANLHEBjOTkdHR5JGw0OFFcuDgEXFxciA8AEBP7lBAsG/nAGCgX+5QQEBAUBGgUKBgGQBgoFARsEBDr+9v6I/vYBCgF4AQpgQiwsUzEwTD8cSjNaKB5CFBYcAgYkJGAzMyQ2WRwdJR9VjwkIOjmeVlZCOFgeQFo+FB8eSyoqKgAAAAUAAP/ABAADwAAgACkAPgBTAGgAAAEiBgcBDgEVERQWFwEeATMhMjY3AT4BNRE0JicBLgEjIRchAREBIQERAQUHDgEPARceAR8BNz4BPwEnLgEvAQUHDgEPARceAR8BNz4BPwEnLgEvARcHDgEPARceAR8BNz4BPwEnLgEvAQE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAMAXgBCv72/oj+9gEKATMiDDUkZ2ckNQwiIww1JGdnJDUMI/6rEgcjFzU1FyMHEhIIIhc2NhciCBLNEggiFzY2FyIIEhIIIhc1NRciCBIDwAQE/uUECwb+cAYKBf7lBAQEBQEaBQoGAZAGCgUBGwQEOv72/oj+9gEKAXgBCmBnJDUMIyIMNSRnZyQ1DCIjDDUkZ+81FyIIEhIIIhc2NhciCBISCCIXNcw2FyIIEhIHIxc1NRcjBxISCCIXNgAAAAAGAAD/wAQAA8AAIAApAQsBSwGLAbIAAAEiBgcBDgEVERQWFwEeATMhMjY3AT4BNRE0JicBLgEjIRchAREBIQERARcGBw4BBwYHDgEXHgEXHgEVDgEXHgEXFjYXHgEXFgYXHgEXOQEeARczOAExOAExNTkBNDYzMhYdARQwMTAWFxQyMzAWMTIWMzIwMxYyFzgBMToBFzgBMTIWMzIwMxYyMTgBMTgBNTA0PQE0Njc+ATMyFhceAR0BHAExFDAxOAExMDI3MjAzMjYzOAExNjIzOAExNjI3MjAzMjYzMDYxOgE1PgExOAE1MTU0NjMyFhU5ARU4ATE4ATEzPgE3OQE+ATc2Jjc+ATc2Fjc+ATc2JjU0Njc+ATc2JicxJicuAScmJzEDMhYXHgEXHgEXHgEXFjIXHgEXFgYHDgEHDgEHDgEjBiYnLgEnNCY3OAExNDY3OAEzMDQxPgE3PgE3NDYzPgEzITIWFzIWFR4BFx4BFzAUMTIwMR4BFTgBMRYGFQ4BBw4BJyImJy4BJy4BJy4BNz4BNzYyNz4BNz4BNz4BNz4BMwcxHgEXHgEXHgEXHgEXHgEHMQYmIyIGJyY2Nz4BNz4BNz4BNz4BNwE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAMAXgBCv72/oj+9gEKvA8eHkQhIhcaFgMCBAQDCgECCwgjEgwdDAYGAgMCAwIGBAMIAwEIBQUIBAQCAQIBAgEBAQECAgECAQMIAwEBAgMEAwEDAgIDAQMEAwIBAQMIAwECAQICAQEBAQIBAgECBAQIBQUIAQMIAwQGAgMCAwIGBgwdDBIjCAsCCQMEBAIDFhoXIiFEHh0QuAQIBAIEAgwWDQYNBwcPBwcMAQENCAcSCAoSCgUMBREcBwUFAQIBBQMBAQEBAQMBAQEDBgMBcAMGAwEBAQMBAQEBAQMFAQIBBQUHHBEFDAUKEgoIEgcIDQEBDAcHDwcHDQYNFgwCBAIECAS4AgMBAQEBAgQBAQMBAQEFBAkFBQkEBQEBAQMBAQQCAQEBAQQBA8AEBP7lBAsG/nAGCgX+5QQEBAUBGgUKBgGQBgoFARsEBDr+9v6I/vYBCgF4AQp5AQQFGhYXIylhLxIkEQ4bDhgzFhAWAwMDBgMJBggXBwQFAwIDAgEGBwcGCQEBAQEBAQEBAQIBAQIBAQQGAQEBAQEBBgQBAQIBAQIBAQEBAQEBAQEJBgcHBgECAwIDBQQHFwgGCQMGAwMDFhAWMxgOGw4RJBIvYSkjFxYaBQQB/p8DAgICAggRBgMFAQECAw4IChMGBQkDBAcCAgEBDxAKFgwIEAcIDAUBAQIBAQMBAQECAwMCAQEBAwEBAgEBBQwIBxAIDBYKEA8BAQICBwQDCAYGEwoIDgMCAQEFAwYRCAICAgIDcQECAQIDAgQJBQQIBAUOAwMFBQMDDgUECAQFCQQCAwIBAgEAAAkAAP/ABAADwAAgACkAUQBlAHkAjQChALYAygAAASIGBwEOARURFBYXAR4BMyEyNjcBPgE1ETQmJwEuASMhFyEBEQEhAREBFwcOAQcnBxcOAQ8BFTMuATU0NjMyFhUUBgczNScuASc3JwcuAS8BIxMHDgEPARceAR8BNz4BPwEnLgEnNwcOAQ8BFx4BHwE3PgE/AScuASclBw4BDwEXHgEfATc+AT8BJy4BJwUHDgEPARceAR8BNz4BPwEnLgEnDwEOAQ8BFx4BHwE3PgE/AScuAS8BFwcOAQ8BFx4BHwE3PgE/AScuAScBOAYKBf7lBAQEBAEbBAsGAZAGCgUBGwQEBAT+5QQLBv5wDAF4AQr+9v6I/vYBCpUmBgsFWzclAgUCWsIBAkQvMEQCAcNcAgQCJTZcBQsFJ00xCAMQChgYChADCAgEDwoYGAoPBN0IBA8KGRkKDwQICAMQChgYChAD/mEIBA8LGBgLDwQICAMPCxgYCw8DARIJAw8LGBgLDwMJCAMPCxgYCw8DiQgEDwoZGQoPBAgIAxAKGBgKEAMIyAgEDwsYGAsPBAgIAxAKGBgKEAMDwAQE/uUECwb+cAYKBf7lBAQEBQEaBQoGAZAGCgUBGwQEOv72/oj+9gEKAXgBCoJbAgQDJTdaBgsGJz8GDQcvREQvBw0GQSYFCwVcNiUCBQJb/rYYCw8ECAgDEAoYGAoQAwgIBA8LChgLDwQICAMQChgYChADCAgEDwsEGAsPAwgJAw8LGBgLDwMJCAMPCxQYChADCAgEDwoYGAoPBAgIAxAKIxgLDwQICAMPCxgYCw8DCAgEDwsYOhgLDwMICQMPCxgYCw8DCQgDDwsAAAAAAgAA/8AEAAPAACAAKAAABSEiJicBLgE1ETQ2NwE+ATMhMhYXAR4BFREUBgcBDgEjJSEBEQEhARECyP5wBgsE/uUEBAQEARsFCgYBkAYLBAEbBAQEBP7lBQoG/nwBeAEK/vb+iP72QAQEARsFCgYBkAYLBAEbBAQEBP7lBQoG/nAGCgX+5gUEOgEKAXgBCv72/ogAAAcAAP/ABAADwAAgACkAMwA7AEMATQBXAAABIgYHAQ4BFREUFhcBHgEzITI2NwE+ATURNCYnAS4BIyEXAyc2Nz4BNzYXFhceARcWFyE3BRMjLgE1NDYlMx4BFRQGBycXBgcOAQcGBxMFIQcmJy4BJyYnATgGCgX+5QQEBAQBGwQLBgGQBgoFARsEBAQE/uUECwb+cMeyXxcdHkYnKEgqJiZCHBsU/p5f/sGyvBARFwGouw8RFxRtXRYeHUQnJyqw/i0BYl0pJyZDHBsVA8AEBP7lBAsG/nAGCgX+5QQEBAUBGgUKBgGQBgoFARsEBLP+zKQhGhslCgsCBA0NKh0cI6So/ssjSCcsUw0eSSYsUiSHoCAbGiULCgEBMJChAw4NKhwcIQAQAAD/wAQAA8AAIABGAGwAiwClALUAzwDqAPsBHgE4AVgBdAGMAaQBygAAASIGBwEOARURFBYXAR4BMyEyNjcBPgE1ETQmJwEuASMhFTAXHgEXFhUwBgcOAQ8BJy4BMTAWFx4BMRQGIzAiNSYnLgEnJjEFMAcOAQcGMRQmJy4BLwE3PgExMAYHDgExMCYnLgExNjc+ATc2FQc2FhceASMOASMwIiMmBgcOATEiJicuATE0Njc+ATMfAR4BFx4BFxYGMTAmLwIuAScuATcyNj8BBxcHDgExMCYnLgExNDY/AQcwFh8BBw4BFRQWHwEjIiY1LgE3PgE3PgEzFzIWFx4BMTAHDgEHBgciJjUxJjY3NDY3OAExFzIWHwEHIyoBMTQ3PgE3NjEXMBYXHgExFiIjKgEnIiYjJjQ3PgE/ATMWMjUwJi8BNz4BNQcyFx4BFxYxMCYjLgEnLgEnNCYnLgExPgExBzAWFRQWFxQGDwEzFjIXMxceATEwIiciJiMiJjU+ATMFMBYXFAYHDgEHIgY5ATQ2PwI+ATc+ATc+ATMHMDMeATMWMRYGDwEjIiYjIiYrAScuATEHHwEeARceARc6ATEwBg8BIyoBIy4BLwEXMzIWMxcHDgE1MCYnLgExMBYXMhYXMhYzMBYXHgEzFDY3PgE/AQE4BgoF/uUEBAQEARsECwYBkAYKBQEbBAQEBP7lBAsG/nAUFTEUFAQDBAoECg4GCAoIBwsdAQEBCwsbCwsBmwgIEwgJBAICCAQIBgIDHhUVHwkGCQUBIB9LHx/VDh0OBgMBASMBCAUdOxcCBAEDAgIEHAwSJRNzBAQPBRkcAgEBCwgSAgYjGQcBAQEJBg2FcgYCBCsdHioYCgiHBAMHAwcGBAUDEw4FBwUDAgsIAwwBeQEGCQYJFxY2FxcBAQEBAgFsB5QCEAQDLhIICwkJFQoJFTUtKToBAgYDLx0eKwEBBAEGAgURBwodFTIGAgTZAQgIFAgIBQMHDwYEAgEMCAkLAR12AQMCBggPEwglEiwGAgMcVihDCAwGAoIBAWYbAwgEETokAgMEAwgFEiELAwgCAQEByxwcQxwcARAGBRAGIhERIQYOBQIDcS8JECMUBwsLCAsDAwYHAgYCKkkaBcUJBAsECSceCw4KCg4GAwQLBAQGAQMCAgMBBQQEDAULA8AEBP7lBAsG/nAGCgX+5QQEBAUBGgUKBgGQBgoFARsEBMEPDyUPDwECAQIFAgYLBAYjGBkjARUBAiUkVyUkBxgYORgYAQQDAwgDCBAHChUPDhYHBAcFARYWNRYWAVUBBAQCAQEZAxMSAgMKBwcLAhEFCAgjAgMNBRpBJAUHCQUOBx40EQUBAgcECQhVEgcKHxYWIAEIAgIkDQkWCBAdEhEaDggBAREyFRAiDgcTCAQGBQcQECYQEAECAwkZBAFMBQUWCAaGARobPxsaRCciHiwBAQEBAQYDCwQKAQEWECURBwoBDRsaQBsbAQIGAwEDAgEoGhsmARQgAgEFGAUBBQYKAQESBwsCAQEBAVsYFAIBFQgjMw0BAQ0JFgILIRQFFAgDBSYBAQEBFgYGAQESBwsoAQgNEQUBAQELBxIEJyEHAwEBdFcfAS4gIC0BAQIBAQkHBgoBDgwKIw4iAAkABf/DA/cDvAA+AE4AXgCGAKsA0gD6ARsBRwAAFy4BJyY2Nz4BNz4BNz4BFxQGBw4BFRQWFx4BISA2NTQnLgEnJicuATU2FhceARceARceAQcOAQcGBwYEIyInNz4BNzYyFx4BFxYGIyImNyE+ATc2MhceARcWBiMiJjcnLgEnJiIHDgEHDgExIjc+ATc2Mz4BNz4BMzIWFx4BHwEVFAYjMCYnNzU3PgE3NhYXHgEXFhceARcWIzAmJy4BJyYiBw4BBw4BMTAmNTc+ATc+ATc+ATU0JicuAS8BBw4BBw4BBw4BMRQWFx4BFx4BMTA2NyUuAScuAScuATM+ATc+ATc+ARceARceARceATMyBgcOAQcOAQcOASclLgEnLgEvATc+ATc+AT8BFx4BFx4BFx4BIyIGBw4BDwEnLgEnLgEnLgEvATc+ATc+ATc+ATc2FhceARceARceAR8BBw4BBw4BBw4BJyIJDwUGBhAIFQcQCAYGFAMQDB0TAwIEdwFYAXteBQQQCgoMCAsCFQUHBxAHFQgRBQoDCAMDlZX+mpeWB1wDNxMcVSAXPgQBVUhEWAEBzgM+FyBWGxM3BAFZREhVAncZQBoeXBoXNxgKEAEMDB4NDQETNh4VFhsYGAwUMhIRAQEQCTsPDzYULWcyGg0CAgwMHAsLAQ8LFzgXF1ocGz4bDRMBlgYMDAYUCAkMDgohFAgGAwQMBwYgDwUHDAkjGAcCAgQC/l4ECgYGIBwMDAMLMAcPEQgCAwEGCQUGBwwNKwgJCRQUIwYFDQQGAwICAgQLBQYaEBIWEBUHBQsEAwMECgYGGBQHBgIIKQYIDAQF4gECAgcVDQw0JRkZJTkLChIHAgQBAQMDBw4IBQoMDTUbEh4tNAoIDgYEBAE8AgkICjBNJWYiThwIBwwCAVY8j2UGAgcCBAEDDAIZGVE1NTwpOgEBDQYIG08iZiVQMwoDBgEBAQEBAU8DEwUGBgUTAwECAgEDEwUGBgUTAwECAgEWCxQGBgUFEwsFBj4+lT4+DhgIBgMDAwYYDQ3FUXMGBbnEDQsbBQwOGQwLCQc9PY06OgYFCxMFBQUFEwwGB3NRNBoUBQMGAgIDAQEEAggVIRkSFBsGBQwCAQIBBAIHGSUHCQ4J5xEjCgsRBgMEAg0ECCIlDAgEHCAKDAcGBgwEBAQOBwYgExcEDVEUHgQGCgMEBAQJBgQeExAQEx0GBgkEAgIMBAUaFhYzAw0GKTUKChIHBAUHFAoJLiIMEwMDCxAeLA0JCQYGDwUEBggWDgssHxIOAwAAAgCn/8ADZAPAAG8ApQAAASIGFREUBgcOASMiJi8BLgEjIgYHBhYXFBceARcWFzAyMTQwMTI2MzAyMTI2MzAyMToBMyE6ATM6ATEWMjMyFjEyFjMUMjMeARcwMjE+ATUxETQmIyIGHQEjNTQmIyIGHQEjNTQmIyIGHQEjETQmIwMqASMwBjEqATEiBiM4ASMwBgcjDgEdARQWMyEyNj0BNCYvAS4BJyI0MSoBMSIwIzQiMSoBIwHgFB0ODAQIBAkPBnsGEgoKEgcPDA0bGk8vLigBAQIBAQECAQEBAwEBVQIDAQEBAQIBAQEBAgEBAQECAQEVFx0VFB0OHRQVHQ4dFBUcDx0UFgECAQEBAQEBAQECAQEJDRYPAVUQFQgGAQMGAwEBAQEBAQECAQPAHRT94w0VBQECBgZ7BwcHBxAwEwEjImI1NSYBAQEBAQEBAQEBIFQeASIUHR0UIFIUHR0UI1UUHR0ULwFmFB38eQEBAQEGFw8ZFBwcFBkMFAYBAwMBAQEAAAEAwP/AAz8DqgAWAAAJAQYWOwERFBY7ATI2NREzMjYnASYiBwHa/uYNGRuaFRC0DxWaGxsP/ugNNAwDqv42Fy/+SxAVFRABtTAWAcoWFgAAAgAA/8AEAAPAABwAOQAAATIXHgEXFhUUBw4BBwYjIicuAScmNTQ3PgE3NjM1IgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIwIAW1BQdyIjIyJ3UFBbW1BPeCIjIyJ4T1BbaV5diykoKCmLXV5pal1diykoKCmLXV1qA3cjIndQUFtbUFB3IiMjIndQUFtbUFB3IiNJKCmLXV5paV5diykoKCmLXV5paV5diykoAAAIAAUAMwQAA1EAWgDEANcA5wD9ARABHwE1AAAlLgEnLgEnLgEnLgEnLgEnLgEnLgEnLgEnJicuAScmJy4BJyY0Nz4BNz4BNz4BMTI2Nz4BNz4BNz4BNz4BNz4BNz4BNz4BMzIWFxYXHgEXFhcWBw4BBwYHBiYnNz4BNz4BNz4BJy4BJy4BBw4BIyIGFTAWFxYGBw4BBw4BJyY2Nz4BMSIGBw4BBw4BBw4BBw4BBw4BBw4BBw4BBwYUFx4BFx4BFx4BFx4BFx4BFx4BFx4BFx4BFx4BFx4BNzQ2MzIWFx4BNycuAScuATc+ARceARUUBgcGIicnLgE1NDYzMhYXFhQHBiInJy4BJyY2Nz4BMzIWFRQWFxYGBwYiJycuATU0Njc2MhceARUUBgcGIic3Jzc+ATMyFgcOAQcGJic3LgE3PgE3NjIXHgEHDgEHDgEjIiYnA2QIKEoaLAUPFysYNg8YPgwCEQkUYAQCCQUHGxpBHh8PChECBQUCHRI4cikWIAEMCQ5GOy4mJRQrCwsVBQQRCA8cLyAQDBATDRIPDhUGBgEBBgcbFBQZCSALKAYMCBEZCAQBBAklFwoTCAIFAgQSAgEEAQUCBQIFEwgGAQcDBAE8UVxgGQ8aAgMaDxAbBAMLBAQ3IyJCDCIhLG4JBBYLCjAWFyoGBxEEBTEeHkUSEzAPKRsFAgQBBgMFBwUNDwlbAQcDBwEFBQ8EAxICAgQTBBsDCgoICQgEBAUFDwUPAwIBAQEDAgYECQoBAQIBAwUSBQUDAQIDBQ8FAwICAgUTAwMFAgIGDA0FAwICAwUPBQoDAQECCAMEEgUDAQIBAwEDBwoFBgM0BBIgCxMDBwoTChgHCxsFAQcECSsBAQQCBAsMHQ0OBgQJAgQSBAIOCBkyEgoOBQQHHxoUERAJEwUFCQICCAMHDBUOBQkOFCEhWjg3QVJIR28lJQ0FAQUkBBEOI2lHK4kpWYMaDAIJAgIHAgMBAxMJBQ0FEAsIBhYRCAsaJCgrCwcLAQELBwcMAgEFAgIYDw8eBQ8FDxQwBAIKBAUVCgoSAwMHAgMVDQ4eCAgWBhMLAwEBAQEBBAYMBAciAQ8JExgFBAEEBDUHAwYCAwRfBC8NCAoOFRkRBQUFZQQMFhcLAwIDCgkDEwoRBwQGBWUCDhUYCwMFBQQLGBYMAwMEZAUhHQwSIg4LAgYBBWUEBgkRIwQEBQQMDAQPBxAJAgMAAgAAAVIEAAIuACMAJwAAATI2PQE0JiMhIgYdARQWOwEVIyIGHQEUFjMhMjY9ATQmKwE1ByE1IQPvBwoKB/wiBwoKBwgIBwoKBwPeBwoKBwgh/HQDjAHyCQccBwkJBxwHCWQJBxwHCQkHHAcJZGRkAAMAAP/BA/8DwAA4AE4AhgAAASIHDgEHBhUUFx4BFxYzMjY3LgEnPgE1DgEjIicuAScmNTQ3PgE3NjMyFhc+ATc+ATcmJy4BJyYjByIGHQEUFh8BFjY/ATYmLwE1NCYrAQUiBgcOAQcOAQcOAR8BMzIWMRYGBw4BFx4BFxY2NzY3PgE3Njc2Ji8BIyoBNTA2Nz4BLwEjKgEjAYBQRUZpHh4eHmlGRVAyXSgMEQMBASJNKkA5OFQYGRkYVDg5QFCHKgQJBQ4cDhkjI1UxMTUZBwsEA4QGDwUdBAIGaAsHMgGEKBECAgMBARkRIgcGBEAaJQESDCEHAQEGBAQJAwE0M3syMwEBAwQEQxsoFxEiBwYEgRgkDgPAHh5pRkVQUEVGaR4eGBcIGA8FCwUTFhkYVDg5QEA5OFQYGUs+BAYCBAQBKyMjMg0OlQsH/gUIAmAFAwYoBhAES9wHC2sBAQEEAQF1UKIpBgMBAVU7mSMEBAYBAQECAU5Nuk5OAgQIAwUBQi5dHAYFAAAADwAA/+EEAAOfABIAMwBJAFwAewCOAJ4AsQDBANQA5gEPASEBQwFVAAAXJxE3PgE/ASEXAwcOAQcOASMhJTQmJyY0Nz4BPQEhFRQGBwYmJy4BPQEjETMyFhUUFjMhJS4BNTQ2Nz4BMzIWBw4BBw4BByImJzcuATU+ATc+ATMyFhUUBgcOASc3LgE1NDY3PgE1NDY3NhYVFBYzMhYVFAYjIgYHDgEnNyY0Nz4BMzIWFxYUBw4BIyImJzMmNDc+ATMyFhUUBiMiJic3JjQ3PgEzMhYXHgEHDgEjIiYnJS4BNTQ2MzIWFRQGBwYiJzUuATU0Njc2MhceARUUBgcGIic1LgE1NDY3NjIXHgEVFAYHBiYBNzU0NjsBETQ1JjQ1NCMwBgcOAQ8BETMyFhcWFAcOASsBFRQWNz4BNycmNDc+ATsBFxYGBw4BIyImJwM+ATc2Nz4BNzY3MiciJiMiIyEVFAYHDgEnJgYHDgEPASElLgE1NDY3PgEXHgEVFAYHBiYFBQwFUDR9AuMLAYI2TwIDgvP+jQLGAQIEBAIB/l4CBAUQBwUC3gcGDX3KAUj9dwICDBYLCgcLCwEBCBERDAgGCAJXAwIBBxMQDgYJCw0WERMHVQICAwgIAwMEChgCBwoLDQwJCQgLFgVxBAUDEBodDQQFBgQOHBsPA3kEBQMQGiMODyMbDwN4BQYEDRsdDAQFAQUDEBodDQT+tgQCBg8OBgIEBhIFBAICBAYUBAMCAgQGEgUEAgIEBhIFBAICAwUUAk1eCQkKAQEuICBBDSAUDgkEBgYDCQ4VAQIBOScXBAQDERooBQYBBQQOHBsPA0sNFQIDFhUyFRUBARkZVjo6Qv7BAwIEFAQEBREGcRUTAoj+LwQCAgQGFAQDAgIEBhIZBQLkCgQ9Jl4L/RhiKDwBAwF5Mx4CAxMDAlWh9CAWDAQGAQYFChcf/WkKBQIBDwIIBAkOEAgFDAoHCA4NBgECA0AEBwYICQ4MBwsJCA4QDQMHQAMIBAcHBwcGCQcIBAsKDwcCCwoKCQQFCAMGEgUXBAICAgQGEgUEAQEDBRcEAgIGDw4FAQMBBhIFBAICBAYUBAMBAQRZBA0dIw4PIx0NBAUGeQQNHBwMBAYFAxAaHQ0EBQZ5BA0cHAwEBgYEDhwbDwMFAf56RgoLCQFIQzw8WRoaIxgYMAoY/hUCBAUSBgQBQygbAQErHUAFFwQCAgcGEQUEAQEDAkgJEAICEBAlEBABAQELBAkCBAEFAwIMBFUQDwsEDhsdDAQFAQUDERkdDQQGAQAAAAAIAAH/wgQAA70ANgB3AIcAmgCtALwAzADxAAAFIiYnJicuAScmLwERAjY3PgE3Njc2MhcWFxYXHgEXFhceARcWFRYQFRQHDgEHDgEHDgEjIiYnNz4BNz4BNTQmJy4BJyY0NzYWHwERBwYHDgEHBicuAScuAS8BERQWNzYWFx4BFRQGBw4BFRQWFx4BFxYXFjI3NjclLgE1NDY3NhYVFAYHDgEnJS4BJyY0Nz4BFx4BFxYGBwYmJyUmNDc+ATc2FhceARUUBgcGJiclLgEnJjQ3PgEXHgEVFAYlJjQ3PgEzMhYVFAYjIiYnEz4BNz4BNTQmJyYnLgEnJgcGBw4BBwYHDgEXHgEXFhceATc2NwF5BBwPOzMzUh0dEAwBBRcmmHobLi9kLy8cPDIyTR0cEgcTAQIBAQU0EjCIWhxPPjFLBP5cmDASGBQQBw0DBgYGIgsLFSk/PpdUVFM9PS4oSBgVAgIFGAYFAwQGEBJXQCVdLhMiIkoiIhL+CQUFGB0tIhIhKhUIAqQVFgUICAYLFBgxBwgBCAcXJv31BwgGFCIkEAUEAxElKxUHAWUPFwIGBwQTJC8THP7/BgYEFiMvEhMwJBQD0T9qLC07Y0chKSpZKisjPzY1WyYmHyoEJitwXRonJ1YqKiA8AwEGCgscEREUDwF3AT5LFiIuDgMCAQIBAwcJCRgPDxEIEQUNdXX+7nNyBwwpChcgCAMCAQE3ByMYCRYIBRIJBAkCBRsGBwEGBwIaChUPDxICAQYFCAkIGAwK/vKdbwMFAwYECQgKCAULFAUQKw8KDgQBAQEBAQGsBAsFDRAHDAgVDg0JCwEJBwUIBQcWCAUCAgIMBwYcBwcBCBkJFwgFBAQEAQQECggSCgQGAQcBAQUCBSAGBAEDAwkTFQgSBx4GAwIIFBIIAgQB5QYUDQ8jDREuEAcGBQgBAgICBgURDAsPFCITFx0MBAICAQIBAwAAABAAA//CA/0DvwA7AGsAewCOALABAQETASYBSgFaAW0BfQGQAbsBzgHhAAAFLgEnLgEnLgEnJjY3PgE3PgE3PgE3PgE3PgE3NhceARcWFx4BMzIWFx4BFxYUBwYHDgEHBgcOAQcOASc3PgEXFjI3PgE3PgE3NiYHDgEHDgEHDgEPAg4BIyImPwEjFRQWFx4BFx4BMzI2NzcmNjc+ATMyFgcOAQcOASc3JjQ3PgE3PgEzMhYVFAYHBiInBy4BJy4BNSImJy4BJy4BLwEXFhceARcWFx4BFx4BMxYmJxM+ATU0NjMyFhUUFjc+ATc2Nz4BNzY3NiYnLgE/AScuAScuAScuAScmBhUUBiMiJicuAQcOAQcGFjMyFhUUBgciBgcGFQYUFxQXFhceATcyNzcuATU0Njc+ARceARUUBgcGJiUuAScuATU0NjMyFhcWFAcOASclLgE1NCYjIiYnJjYzMjY3NhYXHgEzMhYVFAYrARcWBgcGJic3LgEnJjY3NhYXHgEVFAYnJSY2Nz4BMzIWFx4BBw4BIyImJzcuATU0NjMyFhcWFAcGJicnLgE1NCYnLgE3NhYXHgEVFAYnAzUnJjY3PgE3PgE/AQcOAQcOAQcOAQ8BMzIWFRQGBw4BFx4BFx4BFzI2NSUmNjc+ATMyFhUUBgcOAQcGJic3JjY3PgE3NhYXHgEVFAYHBiInAc45czQTQBI3RAsEAgUOPDALFgUFEQYkXjAiMygvLi5VJyciCAwBAisNKzYLBAMGDw8vHx8lOnZFFlQaQwkQBgUHDUNzMjVQEgUEEh5UMQoaBwcdDSACAwgKCwwBAdcNBQwiEQURBQIKBCYGAgoKDAoLCQIBEQcHEQclBAMCAwECDAkLCQwEBRYFsxUfCQICAQ4JFUsVMkkaFAYLEhMzISAoIEwlCA4BBgEItwsFCwkJDAQFBBkNMy8uRxYWBAEDAwcBBgYGDT0sDzIVH1clFAoNBwUKCA8WDRgqDQYCDxALDREHCwEBAQEBAhoaRSIiERkEAgIEBhQEAwICAwYTARUGEggRDg4JCjsHBwcHEQz+5AQDAgIBBwMKBgsCBgMHEQgGCAgNDA0NDgEBAgUIDweGCxMCBgIGBhIiGA8aKf7hBQEEBBEaHQ0FBQEFBBEbHBADjgQLCgsLCQQEBQUTBRoCBAQEBwEGBw4HBhQdCe0GBwEIBQQDCSEUCwwhXx4XFRY2UA8DBwkNBQkPBwQFEQ8thlsCAf78BQEFBjkLDA0OEwkSBAsVBH4FAQUFIxgPCAUEAxAYHBwEPgUoIAw1ETqOUh1qGUp6NgwWBAQNBR4xDQkIAQIHBxwWFhwHCS0PNHpHFmcYMC0tUyQkHy42CwQCAjMGAQYFAgw1KyyDSRYECQ8ZCAIEAQEEAQQQDwsOCwwFCFIbOF8SBwoEAxUHFhobEAwPDi4JCAEHegUVEwgTBQ0MCw4QOQQFBXkqf1UMEQECAQILBAoXDgoaLSopSSAfGhUhCAIDAggQAUYBAwMHCQgGBAEBAQMCBgsKGw4PDgMIBgkVBgYdQXkvESkOFSQJBAEGCAwGCBEDDRmCXSkJCQwMCgICAQEiIVEhIgECAQEBAQIzBQ4dHQ4EBQEFAxIcHREDBQJ1AggCBg0ICQ8XBwcRBwcBBhAGCQoJBwQCCCEEAwcBCQYECwsLCxEMBwQHAgcZAgYCBRcGBQEGBAsMEQUHGwUZBAMCAgUGFgUDAQEESgQ8EQsKDRccIgUFAQWAAwYCARIKGBcHBgEHBzoNDwsM/r5sBQYXBgUNG1GAJhQBBiQTDxASL4pLDw0JBgkJDg8HCQ8IFyIKNzQ+BhgFBRILCwoLBgIGAgQBBCQFFgUECAIBAQUDCAUMCgQEBQAAAAACAAD/wAQAA8AADwATAAABISIGFREUFjMhMjY1ETQmAyERIQPR/F4UGxsUA6IUGxtC/LoDRgPAGxT8XhQbGxQDohQb/F0DRgAEAAoA2wP2AqUAEgA1AE0AYwAAJTQ2PwEzMhYHFAYHDgEVDgErASU1MxceARceAScuATUnMxEjJy4BJy4BJy4BIyIUFR4BHwEjITQ2PwEzEwciJiM0JicuAS8BDwIqATE3LgEnLgEVDgEHDgEHDgEVMBYzMjY1AaEoG0IgEw0BJxscJwELFR/+anEoMSwQBgUBAwMBWGUSByAOHDIJAwQBAQEBAQFZAmgmGkF/hDMVHwEIBAUJAgV6HjEVHe0DHwYDBgEFBAMNBQYIHBMcE98Ch1zhAQEBhVxchgECAe7VSFZUKA8HCBRPTXj+ViANORsxYhYGCgwICVw4iQF8WNT+WAEBARcPEB8HEAFsAbcGbxUNEgEBFg4OMRQUHQEBAQIAAAAACQBI/8IDuAO+ABYAIwA/AFAAYQB0AI0AoQC4AAAXJzUXHgEfATc+ATMwFh0BBw4BMSImJz8CPgE/ARUHDgEPAS8BNRcyFh8BNz4BMzIWFRQGBwYHDgEHBiMiJiclPwE+ATMyFh0BBw4BIzAmNSc/AT4BNz4BPwEVBw4BByImJS8BNz4BMTIWHwEVBw4BMSImJzc1Jy4BMTQ2Nz4BNz4BFx4BHwEPAQ4BDwElNTc+ATMyFh0BBw4BBw4BIzA0NSc1Jy4BJzA2PwEXFQcGBw4BBwYHFCY1ikIeDCgPJEIbJwEBQhsoAScc7AGBNVACBS4TTyVa60IEAicaP4Y4UAEBAQECAiorZCopAQEoGgIdAYY3UAEBAYc4UAEBqAFDG0wZGigDCIY3UAECAf6MQgFBGygBKBtCQhsnAScb60IbJyseH08ZKhUDAicZPgF/NFADBwG9QRonAQEBFwknEhIZAYxBGyYBTziHhggCJydfKSoGARgmjxEHFwgVJRAXKR5HJw8XFhCCSEsfLQIDjxsLLhUzfCaPAxcPJE4gLSceKR4BARkZORgYFw98R04gLSkdR04gLiodVkcmECwODxcCBY9NIC0BGBImliUPFxYQJZYmEBYWEIVJJhAXARoREi4OGAsCARYPJJZJHy0CBJJHJQ8WKB5GDQYWCgoPKh1oSyUPFwEvIE5NkwUBFxc2GBgDASweAAUAQ//EA70DvAA6AEcAVABhAHUAABcuATc+ATc+ATc+ATc+AT0BMwcOAQcOAQ8BIScuAScuAS8BMxUUFhceARcWFx4BFxYVFgYHDgEhICYnJTYmJyYGBw4BFx4BNyc+ATU0JgcOARcWMjc3PgEnLgEHDgEXFjY3AS4BNTQ2PwEzMhYVFAYPAiImJ3EZGgUCOFkIEwYqLgQEA0ACAQQGBjMTCwGUCAMXDSYLAgJAAwMENVIbGBglCwsFHBoNc/7y/u1uDAG9CAEJCRcIBgEDBRsOegwKIxMaAhoNCQzNDw0EByYXIAYfDhgN/sAMDAUHDLupMgUGC7tNdAQzDTMZC2+pDyMKUF8TED5AcoZbMhERZiETDwYqGUc2dIZvPUERE2ubMy8vSBcWBBo0DAUDAwYoBhYJCQMLBwoHDwUMcwYSDRUYCAs0CwYGagkhERYUBgpIDwcBCAKLBRgTDg4HDAsnDA8HDQECAQAAAAABAAv/ywQAA8AAGQAAARcVMxcVMxcHJzUjJwEGJjEnMCY3ASc1IycCdRgy9zEZxhgySv3IEx8xExMCOEoxGQPAGTH3MhjGGTFK/cgTEzEfEwI4SjIYAAAAAQBD/8EDvwPAAcYAAAUuAScuATUmNCM0BgcOASMuAScuATU0Njc+ATc+ATc+ATU8ATEmBgcOAQcOARUwBgcUBgcOAQcOAQcOASMiJicuAScuATU0Njc+ASMwBgcOAQciJicmNjc+ATc+ATE0JicuAScuATc+ATc2FhceATcwNz4BNzY3PgExNCcuAScmIyIGBw4BIyImJyY0Nz4BNz4BNzY0IzQmJy4BJy4BJy4BNz4BFx4BFx4BNTQmJy4BNSY2Nz4BNzYWFx4BFx4BFx4BFx4BNT4BPQEnLgEnLgE1NDY3PgEXHgEfATc8ATc0Njc+ATc+ATMeARceARUeARUUFjMwNjc+ATc+ATMyFhceAQcOAQcOAQcOAQcOARUUFhcUNjc+ATc+ATc+ATc+ARceARceARUUBgcOATMyNjc+ATc+ARcyFhceAQcOAQcOAQcGFhceARceARUUBgcOASMiJicuASMiBgcOARUGFh8BNz4BFx4BFxYUBw4BBw4BMQYWFx4BFx4BFRQGBw4BIyImJy4BJy4BMTAUFx4BFRYGBw4BJy4BJy4BJy4BJzQmJy4BBxQGFQcXHgEXHgEXFgYHDgEHBiYnLgExDgEVFAYHDgEHBiInAfQFCgECAgEBEwwyGQgJDgQCAQoYBhoMGyICAQEBBQQEFgw/RQEBBAIFAgICBwUEBAcGBQMFBgIDAQMCAQMBFyogGwYJEgQEAgYCGBguGg4LOhkEBwMDAQwHCh9VEhkBGxo/GxsCAgIbHEEcHAEBDQhdKAgHDgQDAgMcPwkOAQEBFQ4OIQoJEAIFBAMDFwsGHiMsCgICAQMBAQEDCQYLGwMBBAQEAwICRSspFgECKEUfAgIBAQIGGAsELiMPAQECAQEJBgQEBgcIBQUEAQEBARELHCIIBwUGBAYDCggEAgQFCjYeDhUBAgECARsySRwBAQQDBgQGCxcKAgMBAgECAQICAQElHQ8aBQgEBwgKBAYDAwMWLR0aAQEHDgkgDiANAQEEDgcIITMkIgEBOjgjGwF9Kwk2Sh0FBQ0EBwgEICcPFwEXJSsUAwECCAgCBgYIBQYDIBMrEQEDAwEBAQYWDAUMAQEEBAMEAiNGNhMBAQEGAhkOLi0CBwMIAwoFCA0VLh0BAgECAggEBBEFPwIKBAYnLBgjAQ0JIg8BCAgEBQYKDBEFEggUFwIBG0wrPQEDAgIMByMoAgoGBioXNxcEBAcDAwEBAQMGBgQFBwQlFRYgDBgTDQEJCQcUBgIPDxsQAQgFHA0FBg8JBwsCAwwpCAwBDw8lEBACAQIBEBEnERAGBCwSCggFEQUHDx8FBwEBAQEMCAgUBgYKAgQTCAwLBAIQExkFAQEcExMlBgsGBAQJAwUMDQMuKTcWAQIoGBcLAQGBLCEcLxcFBAUGBwQECwcFAh8ZCgYDFgwhPQUFCwMBAQEDBAUICQUqGRkkCwgUFgUEAQICBRgKBAUEBycUCg8BAQkYLoABAQ8cKhADAyAiTRoGCQEJAQQCBAYMBx0OHh8UEQgOAwQBAQQGBhMGBxAaERABAQUGBQ8HEAwOBQUDCAoOGBEPISEVEAEBShkGGSMNAQEHBAgZBwQREggLAQ4WGQ4GBAUFCg4EAQEBAgISChkJEAoiJQ0LBgQLCgQCDAQFJSwqJQMCFScfCgEBPCtlBQERCx8hAwkYCAMEAQEGDx8TATccHx8EAwgCAgEAAQCR/8ADcAO+AHUAAAUuAScuAScmNDc+ATc+ATc+ATc2JicmNhceARceARcWBgcOARUOATEWNjc+ATc+ATU0JicuATU0Njc+ATc+ARUUBgcOARceARceAR8BJyY2Nz4BNz4BFxYUBw4BBwYUFx4BFx4BFxYGBw4BJwYHDgEjJiciJicBmigyHj9KCAICBiQdBAoCBAkCBgEGAgIHDR8LExcEAgEDAQMBAQESBQYIBAIBAwUNDA0OFUgtCQgDAxMQAgM2MgkNDxIBAQ0NEjkhBwUBAgMGCwMBAQYcFw8SAwdRVRQwAxAgIEMdHAsBDgo5CRIPH1k3DSgNKVAlBg4ECBkKG0olDwUEBxoNFzQgDzUQBg0DAwQBHQoNFg8JDBEUFREqRSQnQSAvTRgFAgMBCQUpTio+fjwLDg8SDxo0FhwzEAMCAQIDBAgeEgk0CytcNCM+H1KCKwoTAQgFBAIBAQMCAAABAAD/7wQAA5EAKgAACQELAScRHAEVHgEXHgEXHgEXHgEXHgEzMjYzPgE3Njc+ATc2PwEtASEJAQIT/rs2SU8BEx0GEAkCBQMOLh8IEQkJEgoIEQgvLy9MGBkDhP79AXn+hwJV/XsDkf45ASn+tGL+4ggOBy5CJQkSCgMEAgsNAgEBAQEBAQQHCA8GBQEhLYYCeP5FAAAAAAEA9f/IAxEDuAA0AAAFLgEnJjY3PgE1MCYrAScmNjc+ATc+ATc+ARczFxYGBw4BFTIWOwEXHgEHFAcOAQcGBw4BJwFVBggBAgoqEBYxIVIFCQksFiEBAQQDBC17pgYICiwWHgEzI1cFBQMBQkKeQkMCBAsEOAIIBQUuyk1wAQEECDbUapkCAgQBAwEBBQklejxXAQEFBQoGAmdm9GZmAQMCAQAAAwA0/8ADzAPAAF0AcACDAAAXJxE0Njc2Nz4BNzY3Njc+ARcWFxYXHgEXFhcWFxQWFQYHDgEnLgEnLgEnJiIHDgEHDgEHDgEjIiYnLgEnLgEnJiIHDgEHDgEHBiInLgEnLgEnJiIHDgEHDgEHIiYnAT4BNzYmJyYGBw4BFRQWFx4BNwU+ATc2NCcuAQcOARceARceATc5BQMJCxMTNiIiKCYqK1ktLSxHPDtaHR0KAQEBAQECCgYDIRUVIgMHFgcDIRUYHwQEDAQFCwQEIBcVIgIHFQcDIRUYHwQJFgkEHxcVIQMGFwcDIxcWIgICBgMBMx4tCAs4MyZKEwgGEBEZQCQBax0yCAMCC1IuPDkbBxENFjcbPQMBHORdKy8sLE4hIRgYDxAOAgILEiYmbERETwpbXNRYWAQGBAMCIBQVIAIDAwEfFBgcAgICAgICHBgUHwEDAwEfFBgcAgQEAR0XFR8BAwMBIRYWIAEBAgG9CDEfMlcLCCMiDxsRGSsQGhELAwgxHgsnDCw3CAptNxAUChAKBgACAAD/wQP7A7wAJQCwAAAXJjQ1NiYnLgEjIiYnNDY3PgE/ATM6ARceARUPAQ4BBw4BIyImJzcuATc0JicuASMiJicmNjc+ATM+ATc+ATc+ATM/ATY3PgE3NjE0JicuAScuAScuAScuAScuATU0Njc+ATM+ATc+ATc+ATc2MhcWFAcOAQcOAQcOAQcUBgcOAQcOAQcOAQcOASMiJicuAScuAScuAScuAScuATEiBw4BBwYPAg4BBw4BBw4BIyImNd0BAQEBAxhUURoBDRcVEgQGak4dAwYCAQMCDRgYDgICAgF0AgEBAgcDIkU6LQEDChwQFwIGFRYNHwkKGAcS5C8qKT4SEwcSCA4DChcFAwgEIBwEBAgjTixFBAQYDA0eCAgUBxANAwMDAQMBAQMBBQICBAECAwEBBQMDBQEBAwIDBQMBCQcECAECBAEBBwoCAwEREj0qKjHlAwMEAQENHhITAgEDOwIwNkQiAwYCAgUCDhcUEQIDAgQaVmcIBQ4YGA0CAnACIEdWGAMBAQEBAw0cDxYEAwEBAgEBAgLkLyopPhMSAQIHAwUBBAgCAQMBDAsBAgUCAwcLBgoBAwICBAEBAwEDBAMNEwcVCAgVBx0TCgUYCwsYBQYlFBQkBAkKCAkDFhUKFAUFCgIDFBwECBERPSopMeUpJTgIDRIeEhIBAQAAAAAFAEH/wQO9A8AAmgDjAPwBGAErAAAXLgEnLgEnLgE3PgE3NjIXFjY3PgE3NiYnLgEjIiYnLgEnLgE3NDY3PgE3PgE3PgE3PgE3MhYXHgEXHgEXHgEfATc+ATc+ATc+ATc+ARceARceARceARcWFAcOAQcOAQcOAQcOAQcGFhceARcWNjc2FhceAQcOAQcOAQcOAQcOAScuAScuAScmJy4BJyYjIgcOAQcGBw4BBw4BJwEiJicuAScuAScuASciJicuAScuATU0Njc+AScuATc+ATc+ATMyFhceARUUBgcGFhceAQcOAQcOASMOAQcOAQcOAQcOAQcOASc3NjIXFjY3NiYnLgEnIgYHDgEHBhYXFjY3Jz4BNz4BNzYmJy4BJyYGBw4BFx4BFzoBMzI2Nxc+ATc2JicuAQcOARUUFhceATeMEBAFBAcIDwYFAw0JCCkdITQoGU4BARUrUD4lGBwLCgsEBAIBAwIDBgcLCwQCBQUGBgkMFAoEEQgSJUk6GiYuElOMFA4dDAsLCAcUBgcLAgQMDAYGAwUFBBMMCREeIx0iGnABAQYEXDQcChYUJyMMCAkFAQoFCQcDAgYCCCAMCRISFBkSDiYnUiAhAgIcG0gkJRQgGxkWGxEBVgIMBg4yCxIMBgkXHggPAwgSBQQCBgsLAgkMBwECOTIjT0BDWCgoLQcLCgEMDQcEBQ0OBwsNCg4EDA8GBAgHCjsgDTEJEQoKCwkYBAQDBxUODgcHAwQdBQUECQgQCk4NCggIDAMEBQoLIh0dJAoPBQ0GHg8CEAgNDwj7ERoHBwYLCiIiLSsODA89GDsGEhILDQgQEg8KEAUEBQUFDggbAQEHDxsPBQUFCggHCAgHCwUGBgMFDgwHCwUGAwEJDAUSCBITHRcKDhEGHzgKBxkQDQsDBAEEAw8IDw8GAgYGChwJBw4FAwIBAQUKCCcBAQMCIA4CAQIDBgQMCSAIAgwHCgsKBw0DCw8CAQwQEhEJBhAPIAwNCgscDg8IDhIWFQkHAW0CAQIMBAcRGycXAgIBAhIKCAoLDRIREisWGyMcO2UhFxMbIiFiNRUgGhcpEhUeEBAQBwMDAQIBBhwcEhIFBxAFAQEBXwYHBwMJCBMOKREBAQMDNA0NEwQDAgVhBQYHBxYLExsKDAwCAwkMFTcTCxIDAwIDBBYPDzAQEAoDAx4cESILDgwGAAAGAAD/wAP3A6kAJwBKAJcAswDGAN8AABc0JicuAScuAScuATU0Njc+ATc2FhceARceARceARceARceAR8CIyU1Nz4BNz4BNz4BNz4BNz4BNzYyFx4BFx4BBw4BBw4BDwEjJSImJy4BLwIuAScuAScuAScuAScuAQ8BNTQ2NzY3PgE3Njc+ATMyFhcWFx4BFxYXHgEdASMOAQcOAQcOAQcOAQcOAR0BBw4BBwYiJzc+AScuAScuASMiBgcOAQcGFhceARceATM+ATcDPgE3PgEnLgEnJgYVFBYXFjY3BT4BNz4BNTQmJy4BJyYGBwYWFx4BFxYyN1wFBgMSCgoSAwoJCg8IBwsODgoKCQcHCwQCDwgJGAgJEAMHApQCsggDFQwaHQYECwUDCAUEEAYGGwYFDgMKAwgEDxQfDgEBk/7KAw4HJksmDgEDEiccFQUCBwMJEA0KJBAKDwoSICBVMzI2IyouLSshNjIyVSEgEwkRFRkgDhATBwIDAwIYFCsRGCFMJQ1KCUogHgMCGBcLExAeKgsFBQIDDQ4GDQgKFBIMDQemDBYJEgQPBxwLMFolHQ0rDAFIFCAJBQICBQcdDiFIFA8BDwodEQojDCAiLRIIKBMUJgYePy0xKQ4IAwEBBgoMHigsNwkDFQwLHwsLGQYOpFxcDAUZDR4lCQg0JhgjCggSAwMDAw8HE3UvFiYnPC00Lz4CAQUZEwcYLygpHh4OBicUOzIPDA0DAQoVRh41MDBPHRwOCQUFCA4cHE4vMDQcTBMIAhEVF0c6EBMFBRsULCUvIgwPFgQCAYEPVUg5RhAHBiMgEhoZLFUdCw8FBQQBAgMBkwUQCxY+GQwZBhY8NiEzCgQBBQIGHRMKDBISCwsOHQcRFSAXPhYPFgUDBAADAAL/zwP5A7gAKgBnAKEAAAU0JicuAScuATc+ATc+ATc0FhceARceARceATMyFgcUBiMiBgcOAQcOATUlNCYnLgEnLgEnLgEnLgE1MDY3PgE3PgE3PgE1NDAzMBYXHgEXHgEXHgEVFAYjIgYHDgEHDgEHDgEVIjQ1ATQmJy4BJy4BIyI2Nz4BNz4BNz4BNz4BNTIWFx4BFx4BFx4BFx4BIyIGBw4BBw4BBw4BBw4BIzgBNQKhCgMIJiYTAQ4hJgoGDQQEBAMKBQUTCwskCAMDAQQCBScJGhkGAgT+nxEEChwUCB8NHVU0CA0JBhNIElJIEgQSAQYEEBsZGmtTCxADAgIQClxqGxUYDAIEAQISDQILMzwKEgIIBgoQLQ0HEAUWFAkCBAEEAggMCwYbDw0sEAkGBwcwDQ4dCAgRAwQJAwECATEKPw4gIggEAgMFFRIMQikJEB8eKQoKEQUFCQEBAQELBAw2OBUSDDAFhBtDVh0LHQgSHQoBAwECAQIPBhppdiCOBwErHoVvJCcxDAEDAQEBAgIROzIncHQXIgEBAQHNBFkNPjcOAwMEAQIMBgMKBRM/TRMbARwUOzgTDBgGBgwCAQQMBQUTCQgkDw8+HwsQAQABAAL/7AP4A5cAVQAANy4BNz4BNz4BMzI2Nz4BJzQmJy4BNTQ2MzIWFx4BFxY2Nz4BNz4BPwI+ATMyBgcOAQcOAQcOAQcGBw4BBwYHBhYfAQcOARUGJi8BBw4BBw4BIyImJzQZGgEBBgQPMQYDCANZNgEJBgkdCxIYDA0FCAIIJTJaSVIOZDiJKxEcAgYHEA0RIhJLISJlJiApKUobGgIFCBIYAQECBFcTGR5OLQIFHQMBIRUkGiACAgYBCBAEAlEzAQEOChBRDAMCBxgIDQEFFylKQEsNVjB0DwYJFCIdFSESSSEhYCIdJyhLHBsFCw0MEB4MEwEEJQ0SG0csCQ84IRcAAAUAK//6A9MDoQAUACAAPQBaAHcAAAEOAQcOAQcWFxY2NzY3Njc+AScmJwUVHgEzMjY1NCYnIwUGBw4BBwYHBgcOAQcGBxYXFjY3Njc2Nz4BJyYnFwYHDgEHBgcGBw4BBwYHFhcWNjc2NzY3PgEnJicXBgcOAQcGBwYHDgEHBgcWFxY2NzY3Njc+AScmJwGZAzs3N4E+JSgoTSQjHh4TFBEDAg3+kg4fEEdjCgjVAgoCCwspHR0mJiopWCwsKzQ3NmsxMSopGxoXAwMSrwMODzYnKDIzODh0PDs5RUlJj0JCODckIx8EBRjLAxITQzAwPz9FRZBKSUdWWluwUlJFRCwsJgUFHgOhP4E3NzwDDAMCERMUHR4kJE4nKCYK6AUGY0cTJREIKy0sVyoqJiYdHSkLDAISAwMYGhspKjEyajc3NAU6Ozx1ODgzMicoNg8QAxcFBCAjJDc4QkOOSklFLEdJSpBGRT8/MDBEExMDHgUFJywsREVSUrFbWlYABAAC/8AD/QO/AEQAcgB6AH0AAAUuASMuAScmJy4BJyYnLgEnJjQ3Njc+ATc2NzY3PgE3Njc+ATMyFhcWFx4BFxYXHgEXFhQHDgEHBgcOAQcGBw4BBw4BIzc+ATc+ATc2JicmJy4BJyYnLgEjIgYHBgcOAQcGBw4BFxYXHgEXFhceARcWNjcDMxMjJyMHIwEHMwHhAgwGLFspJiEiOhgYExYaBQICBAwMJRkZIB0gIUcnJigVIRobIBY3NTRcJyYdHiIHAQEGGhYSGRg6ISIlKVcvCkEHU0d8MzI+CQMDBQkUFDklJSwuXTQdMho4MTFOHRwPCwMJCRQTOiYlKyhSLQwyDoSevoUgzyGFAQ1GjEABAQQaFRIYGDohISUrWDMORw4uKitOIyQgHRcYJQwNBgQCAgQJFRQ/KSgwM2c8DkcOM1grJSEhOhgYEhUZBQEBXQk9MjN/SRtHHS8sLUwfIBYXFgYHDh0cTjExOCthLDAtLE0fHxYUFgMBAgICr/4AXV4Bh8sAAAAEAAL/wAP9A78ARAByAJwArAAABS4BIy4BJyYnLgEnJicuAScmNDc2Nz4BNzY3Njc+ATc2Nz4BMzIWFxYXHgEXFhceARcWFAcOAQcGBw4BBwYHDgEHDgEjNz4BNz4BNzYmJyYnLgEnJicuASMiBgcGBw4BBwYHDgEXFhceARcWFx4BFxY2NwEwNzYyMxYXHgEXFgYHDgEPARceARcWFx4BFxYVBy4BJy4BJy4BIycVIxM+ATc2JicuAS8BFTcyNjcB4QIMBixbKSYhIjoYGBMWGgUCAgQMDCUZGSAdICFHJyYoFSEaGyAWNzU0XCcmHR4iBwEBBhoWEhkYOiEiJSlXLwpBB1NHfDMyPgkDAwUJFBQ5JSUsLl00HTIaODExTh0cDwsDCQkUEzomJSsoUi0MMg7+/BobTCopHjtGDw0BDQonGggGEh8PAw8OIQ0NjQoTCR0UCg0YGxyF3BcVAgEOEAoWIScnFxMGQAEBBBoVEhgYOiEhJStYMw5HDi4qK04jJCAdFxglDA0GBAICBAkVFD8pKDAzZzwORw4zWCslISE6GBgSFRkFAQFdCT0yM39JG0cdLywtTB8gFhcWBgcOHRxOMTE4K2EsMC0sTR8fFhQWAwECAgKvAQEBAgUkIhxLGxYgCgMCBhsXBRwcQRsbAQEXJRI7IQgKBgHDASEFGxkYHwgFAgEBhQEBAgAAAAACAAL/wAP9A78ARAByAAAFLgEjLgEnJicuAScmJy4BJyY0NzY3PgE3Njc2Nz4BNzY3PgEzMhYXFhceARcWFx4BFxYUBw4BBwYHDgEHBgcOAQcOASM3PgE3PgE3NiYnJicuAScmJy4BIyIGBwYHDgEHBgcOARcWFx4BFxYXHgEXFjY3AeECDAYsWykmISI6GBgTFhoFAgIEDAwlGRkgHSAhRycmKBUhGhsgFjc1NFwnJh0eIgcBAQYaFhIZGDohIiUpVy8KQQdTR3wzMj4JAwMFCRQUOSUlLC5dNB0yGjgxMU4dHA8LAwkJFBM6JiUrKFItDDIOQAEBBBoVEhgYOiEhJStYMw5HDi4qK04jJCAdFxglDA0GBAICBAkVFD8pKDAzZzwORw4zWCslISE6GBgSFRkFAQFdCT0yM39JG0cdLywtTB8gFhcWBgcOHRxOMTE4K2EsMC0sTR8fFhQWAwECAgAAAAIAAP/8A/8DgwA8AHYAAAEiBgcGBw4BBwYHDgEVFBYXHgEXHgEXHgEfATc+ATc+ATc+ATc+AScmJy4BJyYnJgYHDgEPAScuAScuAQcXHgEXHgEXFDI3PgE3PgEXHgEXFhQHBgcOAQcGBw4BBw4BDwEnLgEnLgEnLgEnLgEnLgE3PgE3PgEXAQkDEQgtJic7FBUKAwICAw48NCxuYSslGBkZFTA3U2IqLT0QCwkCAhMTQy8uORdCFiZCGwwQG0ElDkoOUC9QGwQHAQEBDz8gJlopQlgOBAUIEBEzJCMvFVsxDyEJFA4LNzUpRBoYRw4cIgkDAgMMXkcYOhkDgwMCCRYVPykqMRAZHyAYDz5sNS1UPRwaFBUVEiEjNUoqLVwxIzskPzU1UBoaCQMCBQghFwwNFyEIAwMCPQc0KAcLAQEBHzoNEAULE2lMGEcWJiMjRSIiIxA8IAkWBw8LCSQiGjAVE0cSJUcoEkMWUXESBgIEAAAAAAEAAP/8A/8DgwA8AAABIgYHBgcOAQcGBw4BFRQWFx4BFx4BFx4BHwE3PgE3PgE3PgE3PgEnJicuAScmJyYGBw4BDwEnLgEnLgEHAQkDEQgtJic7FBUKAwICAw48NCxuYSslGBkZFTA3U2IqLT0PDAkCAhMTQy8uORdCFiZCGwwQG0ElDkoOA4MDAgkWFT8pKjEQGR8gGA8+bDUtVD0cGhQVFRIhIzVKKi1cMSM7JD81NVAaGgkDAgUIIRcMDRchCAMDAgACAAD//AP/A4MAPABpAAABIgYHBgcOAQcGBw4BFRQWFx4BFx4BFx4BHwE3PgE3PgE3PgE3PgEnJicuAScmJyYGBw4BDwEnLgEnLgEHFx4BFx4BFxQyNz4BNz4BFx4BFxYUBwYHDgEHBgcGJy4BJyYnLgE3PgE3PgEXAQkDEQgtJic7FBUKAwICAw48NCxuYSslGBkZFTA3U2IqLT0PDAkCAhMTQy8uORdCFiZCGwwQG0ElDkoOUC9QGwQHAQEBDz8gJlopQlgOBAUPOzqPREQjIklIljo6BQMCAwxeRxg6GQODAwIJFhU/KSoxEBkfIBgPPmw1LVQ9HBoUFRUSISM1SiotXDEjOyQ/NTVQGhoJAwIFCCEXDA0XIQgDAwI9BzQoBwsBAQEfOg0QBQsTaUwYRxYWDQ0OAgIBAQMDDw4NFBJDFlFxEgYCBAAAAAIAAP/8A/8DhAA/AFoAAAEiBgcOAQ8BJy4BJy4BByIGBwYHDgEHBgcOARUUFhceARceARceAR8BNz4BNz4BNz4BNz4BJyYnLgEnJicuASMFMxUzFSMVFBYXHgE7ARUjIiYnLgE9ASM1MzUC1RImDiZCGwwQG0ElDkoOAxEILSYnOxQVCgMCAgMOPDQsbmErJRgZGRUwN1NiKi09DwwJAgITE0MvLjkIFQz+3WZoaAQEBRENNFceKg0MDTIyA4QDAwghFwwNFyEIAwMCAwIJFhU/KSoxEBkfIBgPPmw1LVQ9HBoUFRUSISM1SiotXDEjOyQ/NTVQGhoJAQH5WkiGCw8EBARIDA0MKx6GSFoAAAAAAQAAACED/wNfAJAAADcuAScuATU0Njc+ATsBNz4BNTQmJy4BNTQ2OwEnLgE3NhYfATcvAS4BMTAWHwI/AT4BMTAGDwIXNz4BFxYGDwEzMhYVFAYHDgEVFBYfATMyFhcWBgcOAQcOAScuASc1JwcOASMiJjc0BgcOAScmNj8BJwcXHgEVFAYjIiYnLgEVFgYjIiYvAQcVDgEHBiYnGAYJAQIGAQEEFQ0KPBkjEAwNDgkGBg4MBQYIDhsg680PBggiGDjNzTgYIggGD83rIBsOCAYFDA4GBgkODQwQIxk8Cg4XAgIDAwIECAkfBQoQAXocEQ4DBwgBCAcNDAcHCRog7OsfFQsJBgMKCAcIAQgHAw4RHHoBDAkFGw0kAgMCAx0IBAoCCg08GSQBAREMDRECBQoODA4GCAgaIOvOOBciCAYPzc0PBggiFzjO6yAaCAgGDgwOCgUCEQ0MEQEBJBk8EAwHGgoHBAMDAgEDFwwKehwRCwsHAgcGDQQGCA8aIOvrIBQOBAYJBgkGBwIHCwsRHHoKCxQFAwEDAAAAAAMABP/GA/wDvQCFAJ4AvgAABS4BJy4BPwEnLgEvAQcXBw4BMTAmJy4BNSImIzA2Nz4BMzIWHwE3PgE1MCYvAQcGIiMiJicuATUmNjc+ATc+ATc+ARceARceARceARceARceATEyNjU0Ji8BNz4BNz4BFTAGBw4BDwEnLgExIgYVFBYXFhceARcWFxYXFgYHBgcOAQcOAScnPgEnLgEnLgEvAQcOARUUFx4BFxYzNDY3ATcnLgEnJicuAScmJy4BBw4BBw4BBxQXHgEXFjMwNjcDcAgKBAIBAgFtLnAiUYgHKxIaAgICAwFlBRgRHg4DAhcOI0QcJ3BOvwUBCAQGBgQLCwEBAgQPEB5FJCFRI0iOQw4jAgEKBw0jDAQHAXARDB4VCUAlJTQIBwYUBxEeDBICcAYEJh8gMRERCAcBAQoKCxAFCQcJGQoFDgwEBTMuDycUCmstPzs6jDs6AQIC/s9rCAkhDCcoKFIqKisPOA4VKRQKFQE6Oow6OwE/LToDCggFEgUEby5wIlGITSwSGSAWGB4BCRkSHQ0CAQNEHCgBcU+/AgEBAgURDQYGBAwQBw8UBQUBBAkzKAkXAgEIBQkeCgQGcQEBEgweBwITCwsQAR8WFUEYOR4MEXABAQcEKi8uYTMyMykpKU8lJSIMCwUHBARdJ1wuS5RHGTEXC2stPwEBOjuMOjoBBgQB+WwHCRsKHBcXIgoLBAEBAgEIBgMHAQE6O406O0AsAAACAWD/wQKgA78ACwAcAAAlFAYjIiY1NDYzMhYBEx4BOwEyNjcTNiYrASIGFwKgXkJCXl5CQl7+0xsBHBOEExwBGwEcFboVHAFgQl1dQkNdXQLq/eETGxsTAh8VHR0VAAADAAH/wAQAA58A8AECARUAABc0Njc+ATc+ATc+AScuAS8BNz4BNzYGBw4BBwYiJy4BIyIGBw4BBwYmJy4BMzI2Nz4BNz4BNTQmJyYGBw4BBw4BBw4BBw4BFRwBIyImJy4BJy4BIw4BBw4BBxwBFRYGJy4BJzQmJy4BJyY2Nz4BFxY2Nz4BNzYyHwE3PgE3PgE/Aj4BNzYyFx4BMzI2Nz4BNz4BNzYyBw4BBw4BDwEzMhYfATc+ATc+ATc+ARcWBgcOAQcOAQ8BFx4BFx4BFRQGJy4BJy4BFTAWFx4BFx4BFx4BBw4BBw4BJy4BNTQmJyYGFRQGBw4BDwEhIiMiJiMiMQMWNic0JicmBgcOAQ8BNz4BFzc+ATc2JicmBgcOAQcGFDc+ATfrMRIaOC9YUxgUDgMDBwkLCwgvEAsZJh4RDREXGBUZDB9XLyMiQBcaEA0BDCVRKStFKw0REwkRRiQSGBQPEQ4bCwQDAQECEgMCBAECAwICCwYNEgICBQYFBQIEAwwQAgMNCwoVDQ0WDwULBAYGCQwLCyILBhkNHgEBHRQYQiIHDwQGBwoZLx8YGRIQCQgRIg0OIgUDBwMMBg0SBxQHD0YTECACAQQSCBUGDT8FAwkrZCANJwEBBxcGBxMFAw8ZDQELBiIgAQEPDwkFAQEBDgkDAhYNBh8LC/7LQDg5VBkYVAoDAQQDBw4IAwcBAgwHCwfcEzgBARkLExwKAgcDBQQCEQo/AzcSGTAlRkohHCMSDg4LDAkGOhgSFiggDwYJCAcFKiUcDAcCBQoKBScnKC4TBgkBAg0EBw4SChASDgsHDQYFBAkLBwsOBAIIAwUCAQEBAQcEAgkFCgQHBQsKAwMBAxcRFjQLCwQHBwUNBAgCAwIEBgYdDAYiESsNFSkKCwsCAwQJFh8PDAkFBQUJFwsLJQoGAgECEgcRBQojBgYIAgEDCQUNBAlABwcCCywWCScEAgEBBQ0DAgIDBwQRIxUDFQ1DlU4xVCMUBggDDwcVKwUCAwcUUx0POhISAQJhAQEDAgYDBwEJAwgCBQQDAQFpBhsDAg4DBRMYBwwCBQEBAQUDAAAAAAIAqf/BA2ADvwAxAD4AAAEiBw4BBwYHBhYfARY2Nz4BMzIWFRQGBw4BHQEUFjsBMjY9ATQ3PgE3NjU0Jy4BJyYjAyIGFRQWMzI2NTQmIwIBPDIxVCMkHgsGD1cPJwwmRTouXDQuNW8cFJAUHCcnXicoHx9kPz5AFDlRUTk5UVE5A78MDC4iIisQJgxBDAUPLzQ3LSErGh1bXBQUHBwUDCAVFj0xMVdBODhTFxf9FlE5OVFROTlRAAAHABD/wAPwA8AAgwDPARwBKAE4AhkCKAAABS4BJy4BJy4BJy4BJy4BJy4BLwE3PgE3PgE3PgEXFBYfATc+ATc2FhcWBgcOAQcGFBcWFx4BFxYXHgE3Njc+ATc2NzYmJy4BJy4BJy4BJy4BJy4BNTQ2FR4BFx4BMzIWFx4BFx4BFx4BFx4BHwEHDgEHDgEHDgEHDgEHDgEHDgEjIiYnJy4BJy4BJyY2Nz4BNz4BMzIWFx4BFzI2Nz4BNz4BMzIWFxYUBw4BFRQ2NzYyFRQGBw4BMRQyMz4BNzYWFx4BFx4BFRQGBw4BBw4BJz8BPQEzFz8BNCYHIgYPARUjEScPAQ4BDwEjIgYPATM3PgE/ASMqATUwNz4BNzY3NhYdASMHDgEVFBY7ARUjIgYVFBYfAhUUFjM+ATc3NCYjIgYXFBYxMDY3NCYHBiInJgYVFBYzMjY1ATQmJy4BIyIGBwY0Nz4BNz4BJy4BLwE3PgE3NiYnLgEnLgE1MBYXHgEXHgEXFiYnLgEnLgEnLgE1NDYzMhYXHgEXHgEXFiYnLgEnLgEvATMyFhceARceARceARceATMyFh8BNz4BNTQ2NzYWFx4BFRQGDwEnLgEHDgEHBiY1NCYnJgYHDgEVMDY3PgE3NhYXHgE3PgEXHgEXFjY3NjIXFgYHDgEjIjQ3PgEnNAYHDgEHBjQ3NiYnJgYHDgEnJjY3NiYHDgExIjY3PgE3NiIHDgEHBhY3PgEzMgYHDgEHDgE1JTYmJy4BLwEXHgEXFjI3AdMIIxI2WycXIQ4KFQUGCQkLHxEREB4tBQYgEggEAQIBAwsMHwsLEgUHAQsfKQgEBAcSEjQiISgucS8rJCU3ExIHAwEDCjAeGBYKCRMYCRMECQoBBAkICQ4fJBIKBwwOGCgaGSMKCCkiEAsNIgoNDgYNNSgnWzUTIwgDDhscDgMHQ24fBw8DBAIFCBkSChMCAQMBAQMBAQgFCQ4YGkkdCgUCBAQBAxoEBAIDAgIDCAYSGxUDBQ0sRRELBwQJFm1HGEwYQRleAikBAQMBDQcSXzcCORguCRUNCwkJBXgFAwYCBRQHDA8OJBAQAgICHAgEBg0JGCANEwUECi0BAgERCrEBAQIBAQIBDwEBAgIBAgECAwMC/nQRBAYPCw4dGAMBAxcNEAkDBCgWChILGw8DAgYKEwUCAwgGEiM2LhwKDQIODBoPDAgJCB8KBgkLBhM0NyAuEwgaCQ8pJCQTBgYnEBoDAhwRJCYREB4GAwUHBwgFCQUCBAEBAQQFCQcCBAUFBxkRCCMEAwMHBQUXEA02CQYHDQMGAgMFFQcDAgEFDAMEDAcEAwECCgcHGwMCAwMEAggFBQoCAwEEBwoURBUFAwEDCQkGBhUIDAEDAwUbDg0HER4rBQIBAgMjAwEFBRAfCgQEAQIFBA4GDwsUCgQLAwcYBjsJEgUONScYKhoSNBIWFAwPGQgJCA8wGBxLGg0EBAMKBAoLDBQDAwQICgoMIVEsFEoUKSYlPhcYDxICEA4ZGUEoJywUQxMzVRQRGhgVEw0EDAMIGA0GBwILDAQFAggTDwsCBSAjIUgmIC8RCQQFGQsPGhcyWygnNQ4FEgkDAgIDjg1TPA4tEBVOFB83Fg4VBQMDBQENChQNDA0SAwYJGAgEBgECAwMCAgIJBQUIAQIWHwMBBxhOLxwpISAiGkVmEwYDBDIOExIbGDYlEQEHBQorAT8fI1slSA0hCBELCgQKBAgBFxc5GRkDAw4eLxAHCgEBAWYBAQELBxACIRMOAQgGmAMEBAMCBAQEAwIDAgIDAgMEAwMEASkFKAYIBw8TAgIECS4XGhcHCBABAQoHDQUBAwUHFwoFCAECAwkFAQEDAwUFCAYIAgEECgk2BQEBAwMLEAsGDQcDEAQHCwgIBgYHAQEBBwMHCwkIHAsHAwQECAsFCgMCBwIDBAoRIBUOEAkQCxAOBAEPBAQECAkSAwMICgcsAwMDAwUBAQQLHBQQBgEDDRkCAgMFAwEGIgsLHgMICBkCAQQFBAcBAgIGESILFwsdBwEEDDASDAEGAwMHBAseDAsLEzYZBQMCAg4IBRM4Gg0IBfsDBQcDAwEBCgMIAQQDAAAAAAYAAP/TBAADpwCaAQ4BbwKLAp4DBAAABS4BJy4BNTQmMSIGBw4BFR4BFx4BFxYmJy4BJy4BNzY0Jy4BJy4BJy4BJy4BJy4BJy4BJy4BJzQ2PwEXHgEXHgEXHgEXHgEXHgEXHgEXHgEXHgEXHgEXFjYnJjQxNBYXHgEVFAYHDgExMhYzFjY3NiYnLgEvATMeARceARcWBgcOASciBhceATcyNjM2MjEwBgcOAQcOASMiJiMlLgEnLgEvAQcUFhcWFDEiJicuAScmNDc+ATc+ATEmBgcOATE0Njc+ATc+ARcWFAcOARUOATMwNjc+ATc+AQcOAQcGFjc+ATc2FhcyBgcOAQcOARUUFhceARceARcWNjc+ATc+ATEyFh8BBw4BBw4BIyoBIwEuASciJjE0Njc+ATc+ATc+ASMmBgcOAQ8BNz4BNz4BNzYyBw4BFxY2Nz4BNz4BNzMHDgEVFBYzMjY3PgE3NhYXHgEVMCYjJgYHDgEPAScuAQcOAQcOAQcOAQcOATUwJicFPgE1NAYHIgYjBzc+ATc2JicuASMiBgcOATE0Njc+AT8BJy4BLwE3PgE3NiYnIgYHDgEHDgEzMhYXHgEjIgYHDgEHDgExMDQ3PgEnLgEnJiIHBiI3PgE3PgE3PgE3NiYnLgEvATMyFhceATE0JicuAScmND8BFx4BFx4BFx4BFx4BMTImJy4BLwIuATU0Njc+ATc2FhUeARceARceARcWNicuAScuAScmNDc+ATc2FhUUFhceARceARceARceAR0BFx4BFRQWMzA2Nz4BPwEXFgYHDgEHDgExIjQ3NjQnLgEnLgEjKgExNDY3PgE3NiYjIgYPATMyFhcyBgcOARceATcyNjc+ARUOARceATcyNjM3Bw4BBw4BDwE3NzQmJy4BJy4BIxQWFx4BFxYyNTcuAScuAS8BNz4BNzY0Jy4BJyYGBw4BBw4BFxYGBw4BFRQWHwEnLgEnLgE1NAYHDgEXHgExFCYnLgEnJjQ3PgE3NhYVFBYfATc+ATc+ARcwBgcOAR0BNz4BFx4BFxYGBw4BMSImJwMdIzgQBgkBAggDBAMBAQECBwQDAwkUHQYDAgEBAgMJBgcvGwsTAgsLAQIFBwIKBRANAgECAQECEQ8CCwUMCwYHBgMCBAMDCg8ODwcGGDQrGAsZIwYBDwMLCwkKAwMBCAYhMwYDBAUFFgsIEhckEw4YBhAZJBMoGQ8CCA4sDwQHAgEDAgILMBkGHgEBBgT98iQ/HQsZBgcBAgEBAgkFFR4GAgEDCgYBAgEaCQQFCAQPLRoHAwIEBAIDAQIBBgQQNxgRBAUGCQICAQgMGAwIFAMBBQQaIQcCAQMEBQ0LCA0KIUUjEiAKAgMCQBAECCNgOhMgGAoQAgFMERIHAgMTCA4rESRKIQsBCiVbJgQPBQ4CAxMKDiQRCgIECQYDAw4KFBEFDRsKBgkMDgUDAQwIEBYMIEYgBhQFAxAqGBEgCQUHEzIXDRcKDCkPBhQEAQINCf7iBxQEAwQLBQwFBwsCBRMVBQkIDBEJAwQIAwgXDAkEAiAGAwMKMhMLBw8PFQ4UIAsCAgECGAcHBgQDHgwTJQsDBAEEBAICDw8GHwoIAgEDEgcEEQgeFQMDDRADCAMGDAwdCwUHAQEDBQEBAgEEBAkHDBYaHh0IAQIBBAMGFQwIAwEBAgQCBwIBAQINDwcfFR4eCAMBAwkeHhgPAgIDAgQCAQEGBQkfIBgWCgUHAwIBAwcKAQEEAwUOAgIBAQECBRgPAwQBAQECAQgFBxoQBQcCAgIDAQQRHBMvDAMHCRkGAQECBgUCAgkEAQQBAwEEAwICCgcCBgECAwMOCAseDQgFfAUDBAwFBAsBBgIFDAgECA8FEQcLFQcEBgUHAgICBR4VCRYIExkGAQECAQEBAwIBAQEHEyEKBAsFAwcDAwEBDgMIDAMCAgMMBgEBAwMBAgUfEwYSAQIBAQIIG1kuOkkDAhcVBQwBBwYsAyUgCx4IAQIMBgkQCgUKAwYPBAUBBAkgFAsUFBMbBwkRBgcoFgkQAwsXDxQOBwIJAw0RCwYOBQMFDBIDAQEBAQIDBAwNDAkEAwIBAQMDAxQrIxECBCcZAwMBDAQOHxMSGQoDBQEBHBgKGAoJEgQDAQsNCRwOJ04ZDAwBAQUKCgICAQMDDRoFAQMBEQUZFQkZCgsJCBQEAQEIBhhJKww8CxIkDgMGAREIAwQBFgkeQBsIAgEDExQJEgMKEQYEECYMCAEHChkODQEGCgsCAQMCBgUaPSAJCxATEg4OFgsJCQUQDx8PJxIDBDYOBBBFVxAGBQFeDwwDAgEaCREqDRwiAwIBASMeAw4FDgUMJA4UJQwHBwwRAgMGCBANBAgMAQUIDgUDBAMCBQUBAxcYBRIBAQMCBgQMBwMECwQIBA4JCzkaCycJAgQBCgcMBBgDAQEBAgEEBhMKFSEHAgEDBAIBAQ8FDBYGBQEBCAEBAggQAQECAQIEBRELAgMEAQICCwYKGAoDBAQCDBsIDRAEAQICAgMNBQMJBBEOBQcYDgMGAgQCAgECAQICBQ8HBhsFBAcICwgLDw8RFg0CAwsFDBcJBQoGCxATFA0HEAMBAgcTIRMJHxMbIA4FAQcTJRsWEAYGIwgIDAICAgYJFQoTJB0WGA8IEAkHCAoPAQMNBgICAgEDDgQEBAQYBhcnCgICAgIEDwUFCwIFBgEEAwMIAg8LBwQCBAIEAwwYBgUEAgMCAgEBDhkEBAQBAQEGBg4FCAsBAQS7AgsEBQwEAwUBEAUJDAICAXQEEAcKFwgFCwkUCgkdCRkhBAIBAwcfFQcbBwUGCA4aDQYMAgQDCx8TBxoCAgoHFCgTBAUBEAUMIBEOJg0QHwYCAgYHEwUECRg2FAUPAQUDBQgFCggbEwsOXEAeTCAJEAcFAAACAAD/wAQAAsAAGQAuAAAXNjc2Ejc2Nz4BNzYWFx4BExYXHgEXFh8BISUuATU0Njc+ATMyFhceARceAR8BIwQEODeDNjYCAQoEBwgHBzN6IyAfMRAPAgv9AAL3ITATDhoSDg4SHg9CHh4uAgS3Ngl1dQETcXICAwYCAgEDBGX+/UpDQ2cgIQQWrUdoAgIrHjgaG0AhjEFCYgQKAAAFAAX//wP7A4EAQAB3ALoA4ADsAAA3LgEnJjY3Njc+ATc2Nz4BNz4BNz4BNz4BMzIWFx4BFx4BFx4BFx4BFx4BFx4BFx4BFx4BFxYGDwEFIiMiJicmJzc+ATc2JicuAScuAScmNhceATc+ATU0JicuAScmBgcGFhceAQcwJicuAQcOARUUFhceARceATclPgE3NiYjIgYVFAYjIiY1NDY3PgEnLgEjIgYHDgEHBiYnLgE3PgE3PgEnLgEnJgYHBhYXHgE3PgExMBYVHgEXFjY3ATI2PQEzMjY3NiYvAjU0JicmIgcOAQcOARceARczFx4BNzI2Myc+ATc+ATEyFh0BIxQECQIIDy4MEBEmExMRITYFBCYVVzIFBAsEDBsiECMHCBEDBAoDBxUIAyMVFi8LDBsHKUAFBgMJCf4ZmmBfbBUUA64JCgIBAgYEDQUJBQECJj0qHA4IDhcRHA4ICRUEAgcQCQ4BFw8kNhAXEwQECRoLDA0IAo4UJwcFExMJBB4PBQ8IBgkEAgMdBQILBQcNBAgFBgkFAgIZDgsFAgIGBxM3Eg4EEhAlEAUHAQEXEw0XDf7gBAELDg0DAgECBCQGDQglCQZaBwUBBAcSKTEBAQ8VBgsDYQMOBwYLAQI1AwIHAw0kUBQdHkEhIR05XggIQSSYUwUCBCI7HDwODR0HBxEFCiUPBTwlJVIUFC8MRnAJDRMKCQEBAQEBIgQMBwYEAgIKBQkLCRcGEAoBCAUVBwImGCsQAQEMCAUPGA4WAQUFCwIIDB8YDRAKEh8GBgEFCQkyGRMZAgcTKBAFAxAJDgsEBRMMCAoNAgQBBAcKCgwdBwUFBQoKBA0kJxsyEQ8JBwIDCAUTHAcFAgYBywgQGQgLBwsHDQI8MxoFBAMCeA0LGQoPBgETFAwCAXkFFgoKDhYPJQAAAAAIAAL/wAP+A8AAKABiAHIAhQCtALkA1AEFAAAXLgEnLgEZATc+ATcyNzI2NzIzIBYXHgEXHgEREAYHDgEHBgcOASMiJzc+ATc2JicuAScuASMiBgcOAScmNjc+ATc+ARceARcWNjc2JicuAScmBgcOAQcOARUUFhceARcWNjcnLgEnJjY3NhYXFgYHDgEnJRA2Nz4BNz4BHwEREAYHDgEPARM+ATU0Njc+ATU0JiMiBgcGJjU0JicmBgcOAQcGFB8BNxUUFjMyNjcnNDY3NBYdAQcOATUBPgE3PgE3MjMyFjMyFx4BFxYGBw4BBw4BKQElPgE1NCYPATc+ATc+ATc+ATc0Jy4BBwYHDgEHDgEXHgE3NhYHDgEnJgYHBhYXFjY38Z0wDw8EBwcaDgMdHmFCQUsBHVoSBAsDBQICBQYYDAUvMJZhYWjxIykJBQEECB4aDBEUGyIVBwsBAQ0EBRoMDjIUCREDBQQDCQsVCxQWDx8JMEIQBAMKDg81HhQ3EFIQEwICBgwZLQ4TBhYKIAwB4AQPBB0ZIBQFBwIEAyYeQGEGAgMFBgMCAQEEAwQCAQECDQcGFw4FBAQmBAMBBgQjEgEBCgQF/OQpHwoMZ/xIQUFjHx4DCgYBARMdJyQZD3H+//6TAeEoNEQnHQcGFjUyGgYEBQEdHkkiIQgNJBIHAwMEKBslIBUMSRoODgwXCiIaZB4/AQUQEU4BLgFuDw0UBAEBAQQOAw4FC2D+7v7zZQkMFQQBAQEBAdYNLiQUJhQfJwwFAwoPBQcBATUJDhwGBwMGAgQBAQQHFSAKBQQBAQECCUU6ECAiLzcdHCkFAwQGRgchGRYRBw8CEBZFDwYCBp8BJV0cCCIaIBEBAv6R/vlrCQYqHUABIAgNFxYQCwoQFQ4TBAIEFj4jNgMJBAsKd18bNQsLKxIRGgYFcwZqAQEcFDAMBAQCAckpGwQEAgEBAQEEBQUWHCYaBwQCHAYYDAsNAwIHBgIBAQMEAwYBAgEBAQEBAQMVDwYFAwUDAwQLCAUBBAIBBAgMBAMEBAAACgA5/8ADxwPAAC8AVgCMALsAzgDaAQQBIgE/AW8AAAUuAScuAScuAScuAScuASc0MzI2MzIzMjMyFjMWMQ4BBw4BBw4BBw4BBw4BByoBJzc+AScuASMqATUwNjc+AScuASsBBw4BBw4BBw4BFRQWFx4BMzI2NyUmNjc2Nz4BNzY3PgE3PgE3PgE3PgE3PgEzMhYXHgEXHgEXHgEXHgEXHgEXHgEHBgcGICciJyU+ATc+AScuAS8BNz4BNTQmJy4BJy4BBw4BBw4BFRQWHwEHDgEHDgEVFBYXHgE3Jy4BNTQ2NzYWFx4BFRQGBwYiJzcuATc+ARcWBgcGJgU0Njc+ATc+ATc+ATc+ATc+AT8BBw4BBw4BBw4BBw4BBw4BBw4BBwYmNTc+ATc2NCcuAScmBgcGFBceATEOAQcOAR8BNz4BNwEuAScmJy4BJyYnLgEnLgExNBYXHgEXHgEfAQcVAz4BNzYmJy4BJyYGHQEnNTQmJyYGFxUXHgEzPgEnLgE3NhYXHgEXFgYHBhY3MjY3AfcEDQcGIhESHgQEPCZkPQIfIG9KS1RdTEtrHBwBKBscNAoJKRMUKwsqNAYDCQNgBQIEAg8iFRwVDx8HEAQQCBQKBA0FBhQJDQgDBAUXOTEfA/3zAQgTBhAQJRARBwcUBxceHBlGFQYWCwoRAQEPCgkhDg02GBklAgIWDQ0iCkUmAQGIif64iYgBAd8WIgcFAwMDEQwKCw0LAwQFFAoQOxQWHgkEAggNCw0FDAMEAyQhDjcNQAgICgkPGgwEAwgKCBwJAwoHAwUiDw8EEQsO/kQBBAUMFh5EGw4tEhE3FRQlBAsXCSAMDRwHDDY2CiIOGiUZBwsBAQGNKhMFBwUDBQEEFwYDAwEBB0gIEQwDARIHJxQCvxs4DQwZGjUVFQQCGhEQF4OFHjwNEwwEBgEtBAIBAQYJCyIREQ4WBwwPBQEJB0IHBgUBAwEBAQoGCQcBAQMHBh0JAQQCPwEGBAQUCgoRAwIiFjojAgEBAQEBGA8QHgYGFwsLGQcZHAEBQgQOBwMCAR0TKRUGAgIOBhMHCB0MEg8GBgYDBAICAsYCECALHBw+HR0OCyINJzQwLXglCSgSERkYERA5GBddKypAAwQlFxc6EnZGAgEBAQECeAYZEQsgDg0aCAgLDBoSDQ0IChUFCAYGBRcSBw0RFhYNCgsFDwYJDQ0gKgkDAQQ3BRELDBMGCQUPBgoJDBAGBQWICRQLEQwKCioKBgEgpEMGCgoNEScQCBoKCiAMDBUCBygRNhYWMA0UXl4ROxgsQSwMEgEBhV6RIxQMDh0UCQ8BBxEPBwgLBgoGPwcPHhcREAYiEf78LmEXFCwsXCUlBgQuHBwqAUtOESMHCwkIC+TkASAEDhYdJxccLQgIFSAeGCYkGgwQDDdBEBBGAQwMGhIFBwEGChQREA4LCSsDBQMAAAAMAAX/wAP7A8AAGQBcAHoAnQC5ANIA6wEtAWEBdAGHAZQAACUmJy4BJyYvATc+AT8BFx4BHwEVFAYxMCYnNz4BJy4BIyIGIw4BFxYUBwYiJy4BJyY2PwEnBwYmJyY2MzIWFx4BNzI2Mz4BNTYmJy4BBw4BFRQWFx4BBwYWFxYyNxc1NzY3PgE3NjMyFh8BBwYHDgEHBgcGBw4BBwYPARM+ASciJi8BNz4BNz4BNTQmBw4BBw4BBw4BDwEXHgExMDY3JS4BJyY3PgE3NjMyFx4BFxYHBgcOAQcGMSImJzc+ATc2JicuAScuASMiBgcOARceARcWNjcnLgEnLgE1NDY3PgEzMhYXFgYHDgEHBiInBTA3PgE3NjEyBgcOARcwFjMyNjc+ATEwJiMuATc+ATc+ATc+AScmNjc+ATc+AT8BBwYHDgEHBhUwBw4BBwYjIiY1JS8BLgEnJhYXFhceARcWMRQGBw4BFx4BFx4BBwYWFx4BFxY2JzwBFzAWFx4BFx4BIyImJycuATc0NjMeARceARUWBgciJiMlPgE3PgEzMgYHDgEHDgEHBjY3JS4BNzYWFxYGIyImJwEuJiYmPxcXCi4OBjchUSIPUStpAW5NNw0IBgMEBgQIAwQBAgMDBBAHAwcCBQQJCQ0KCxEGCQYNCA8FAgUBAQgEBAcCFgcMEQ4WExgSBwIDBx0WCRsIsQkULCxbIyMBATonXxMEExQ9JyYrKiYmOxMSAwzSAwIBARYPIw4XJg0JDx0BAQQDDy4cDgkDBTYWIAQD/pU1TQEBKShiKikBASkqYigpAQEpKGIpKQFMNqENEQUDAwQFDwsHCw8UEwoLDAICEhMKKgwrBAYCBAEBAwQKCQ4NAgEEBAIFBAcHB/4SExQuExQBAgECAgE/BQIHAwQFCAYSDQEBEgwbHQoNBAgECyQUMA4OGAIGBQElJVckJB8fSx8fAQEBA5BjdDBHAQIDBAYcHD8ZGQQECgYGBRMJBgMBARINDRYMDhQDARsSEiUICAoBAjspSAoWAQQGCA4IAwQBAgUDBgH9VgIaDxQTAwkLDQMWDAwUAgQBBAJrCQUEBhkFAwMHBQcHhSgoJ0MYGAoxAwIOCRQPByYUMcxUeHNRNgYYEQkDAQICBgcIBAQEAggFCgwDAxgBAgkKDhMICAQEAQIBAgECGwUIBQEBERITJQcDAwUOKwgDBC/NBAoUFSoPEA4KFxQEFBRAKCgsLCgoPRMTAwwBCAgIAQUCBg0UKhYNGwMBBwEBCQYdOxgNCgkNCgUFCQfyGSQBAUdHq0dHR0erR0cBARMTLhMSIxk9Bh4XEEUODxMGBAEHDA00HyUqCgUBBR0CBgYIER8cFAcKBxgfFSsKBgUCAwNAFRUxFRQDAgMDAQgIBgUJAgIDAQEMBxAZEBMeBgMOJhU0Dw8ZAgYIA0FAmUA/AQgIFAgIAQEYGc1VfAIDAgQFHh5DHBsBAQECEw0JFQYFBAUIIQ0MDAECDgoBAwEbFBMoCQgMDgtwBBwIBQIBCQsFCQQGAgEBIAQcEBUSHQwDDwgHDgIDAgQzCQ4DBRAMBwcEBwAAEgAU/8AD7APAACcATABYAGsAnAC1ANQA/AEjAV4BggG2AdoCHQJIAmgCdQKBAAAFIiYnLgEjMCYnJjY3PgE3PgE/ATMyFhceARUWBgcGBw4BBwYHKgEnNz4BNTQmJy4BBwYmNz4BFzIWFxY2Jy4BJyYGBw4BFx4BFxY2NycuATU0NhceAQcOATc+AScuASMiBgcGFhceATMyNjcFLgEnLgEnLgEnLgEnPAE3NDY3NhYXHgEXHgEXHgEXHgEXHgEXHgEXFhQHDgEHBiYnJzYmJy4BMTI2Nz4BJzQmJyYGBwYWFx4BNyc2JicuATM0Njc+ATU0JiMiBgcGFhceARceATMyNjcBLgEnLgE1NDY3PgE3PgE3PgEzHgEXHgEVFAYHDgEHDgEHDgEHBiYnNz4BNz4BNTQmBw4BBzAGBw4BMQYmJy4BJyYGBw4BDwEXHgEzMjY3BS4BJy4BJy4BJy4BNTQ2Nz4BNz4BNz4BNzYyFx4BFx4BFx4BFx4BFRQGBw4BBw4BBw4BBwYHKgEnIic3MjYnNScuASciBgcOAQcOARcWNjc+ATMyFhUUFhceARcWNjc3PgE3NiYvASMGJjEwNjc+ATc+AScuASMiBgcGFh8BNz4BNzYWFRQGBw4BBwYWHwEzMjY3AS4BNTQ2Nz4BNz4BNz4BNz4BNz4BFx4BFTIWHQEHDgEjIiYnNz4BNzYmJy4BIyIGBw4BJzA2NzYmBw4BBw4BFxY2Nz4BMzYWFQ4BBw4BFRQWFzI2Nz4BFx4BBw4BBw4BBwYWFxY2NwUuAScuAS8BNTc+ATMeARceARceARceARceARceARceARceAQcOASMiJic3PgEnNCYvARcWNjc2JicuAQcGFB8BJyYGBwYWFx4BNycuATc2MhceAQcGIic3LgEzMhYVFAYjIiYB9ANSNTZMAQEBAgYWChUEBQoCBcZmYgIEUAEBAQEqKmQsKwUECgRBDg8HBwwzEQsEBwgVEwoQAgQLAgELDg4vDRscBgMaERA5DkIFBRoHBwoBAhxWAwEDASUtOxcCAgEDAxU6NRsC/m8CHxUUMA0MFQECAQEBAwIEFC4qGQMDCAcFEAcGEQYGEAUFCgIEAglGAgQGAygEAgUDBAEQCxsIAQoCAlACBgcMDQwGJQECBQMDARELFQwNAwRNAQMBAgMXBAIFAwQCAgK8Ah4kBggHBQUkFBQeAQOBAwIEAQMBAQMCIRADIBMsEwICCQNkBAgLBwsIBQIEAQcFBAcBDg4FCgIFCAUCBQECCSUQBgEFAv2uAgYBAhQQDh0GFQoNDQcQBApJTSY5AgQHAwMpHhs7DjMxDA0LCAYOGxcKEgIFCQgDOjqKOjoEhgIBAQUEDAgHCg8KEAMLAgoCBQsHCgECAQEBAwcGBhgEuwIFAQIBAwIoERgPChcVBQoBCAkoHR0iAwEEBAYMBQ0FERoRHhoPAwQECAQ/JxsD/eQvFQ4JChIDHFEEBhEQEEpOMh4DAQQBAaFfRAQDJRylFzEHBgEFBAYGBQkCAgMBAgIKEhUOLBIOCAcFDAoMFggHAgENDAkFBgUBCgcQEAQEAgQFIg0GBQICAgQFDQ0CCRgwCwo9IU8FAwQCAjAgIEwVFiIDCRIaDBwGBxEFBhQIDwcFBH4FAiAcCQUGAgMCBQcIDgMHCxIfQgkDBAMJCA4FChkdHSwMPAoOAwIMCgkLBAIMBRgLBQoGFgcDAgc/GxISGgMCBgseDhwHBg0CBQEBAmsFAgQCAQ8OIg4OAQE3BA0JBwkEBwUEAgMFBgQBAQEBCQQEBAICAQQGIBIMEgMDAgQRAgcFAwQBAggEBgVhAwwDAQEBAwQHBAMBAQItASsdHEISER4EBi5fOVYCAwUBAgUQDgoDAxUVETITFDYTEjEPECAHDQYEDV4CAgEDkgQOCwYIBgQJBgoGHAMCHAMHHRYWCwV7BQcKBQoBBgQGCAYIIhwCBBIICSkEAgIDBf7zAicxCA0BAhgQD289PloBAisBAgECKWlmLQUFLxYELBs9GgECAQPAAxYmGCUCBgcBAQEBFw8PFgEZGAoPAQIFCgQNBAoOOxYDAkUBAwIBPDArWxVAIwIFDgkGCwMHNTgcJwEBAQEcFhQrCiUkCAkQBwIcEixSRh84Bw0NAwEBAQKTI0VnBgcHAQMGBAkCCBsMAwEDAwMhKi0fAwUGAQEBAgMBBQIFFgYGAQENCRQWCxEhEBQTEBAHDQYGBQMEAQMMCwsWGxgPBwoeCQQBAgEMEAoGARUODRoEJ3EDBgkFBRcZEAgBAQMBLB1HdUUwCwptCyoOCxAFBAIBAQEBAQUEEBQEBBoRDREEAwQKDA8BAgYDDAkGBgMECAMFBQwIAQEKBQcWBQIEBAUJAQIDBlkSIwgHLRc6jgQCAQEPCgoYBwcMAgUVIxIlCQkXCAgbCxUPBQIrFhRVAw4FAwkDCQEBBAUJHBEdExIFDAYHAQEEBQssFBQNCCcEEgYEAwQUBQICLQUWEQUDBgIAAAAiAD//wAPBA8AAKwBZAGEAfwDEANQA8gEXAScBMwFdAXkBnQG5AcYBzwH+Ah0CMwJeAo4CuQLIAtgC/QMxAz8DVANzA4kDlgOyA90D9QAABS4BJy4BJy4BJy4BJy4BJy4BIzQ2MzIzMhYzMjEUBgcOAQcOAQcOASMiJicnMjY3PgE1NCYnLgErATU0JicmBgcOARUXIyIGBw4BFx4BOwEVFBYXHgE3OgEzJzUzBw4BDwEXPgE3PgEnJiIHDgExIiY1NCYnJgYjBxUUFhcWMjcHLgEnLgEnLgEnLgEnJjIzFjY3NiYnLgEHIgYXFBYXHgEjIiYnLgEHBhYfAScuATU0NjMyFhceARceARceARceASMwJicnNCYnLgEHBhYXHgEXHgE1BT4BNz4BMzIWHwEHDgEHDgEHDgEHDgEHDgExIjY3PwEXHgE3PgE/ATU0JicmBg8BJyYGBw4BFRQWFxYUBw4BFxY2NzcuATUwNjc+ARceASMwJicFLgE1NDYXHgEVFAYnLgE9ARcWNjc+AScuASMiBgcOARUUFhceASMiJi8CFx4BFRQGIyImNTc2JicmNDc+ATc+ATU2JiMOAQcGFhceATMWNjcFLgEnLgExIjY/ARUOAQ8BJy4BJyYGDwEXHgEfARUUBgcGJic3PgEnLgEjIiYnLgEHDgEHBhYXHgE3MhYXHgE3JyY2NzYyFxYGIyImJycuATc+ARcWBgU0Njc+ATc+ATc+ATc+ATEwFhceARceARceARceARceARceARUUIiMiIyoBIyYxJT4BNTQmJy4BJy4BIyIGBw4BBw4BFRQWFx4BNzI2NycuATUmNjc2FhceARUUBgcOAQcGJicHPgEvAjc+ATc2JicmBgcOARcWMjc2FgcOAQcOAQcGFBceARceATMyNjcFNCcuAScmJy4BNz4BNz4BNzY3PgE3NjEUBgcOAQcOAQcOAQcOAQcOAQcOAQcOAScTPgE3NjQnLgEHBiYnLgEjIgYHDgEVFBYXHgEzMjY3NhYXFBYXHgEXFjY3Jy4BNTQ2NzYWFxYGBw4BJy4BNTQ2Nz4BFx4BBw4BJwEuAScuAScuAScuATMwFhceARceARcWBgcOAQcOAQcOAQcwJicnPgE3NiYnLgEzNBYXHgE3PgE3NiYjIgYVFBYXHgEXFgYjIiYnLgEjIgYHBhQXHgEXHgE3BS4BNTQ2MzIWFRQGDwETPgE3PgE3PgEzMhYdAQcOAQciNjc3MjY1NDY3PgE1NAYHDgEVFBY3PgExMAYHDgEXFjI3Nz4BNzYmJy4BIyIGBw4BBwYWFxY2NycmNjc2MhUWBgcOAScFLgEjLgE1NDYzMhYXHgEXHgEXHgEXHgEVFiYnNzQmJy4BJy4BNTA2Nz4BJy4BByIGBxQWFx4BMzYWFxYGBw4BFx4BFx4BNyc0JicuASciJgcOARceATsBFx4BFx4BNQH5AhILEhYOAhEJEykVBxwMDBIBnnk5MzNMFhYFAwQPCA9NST0QAgEEAiYDDBUSBgEDBAgUGwQEBRIDAQEBCAQFAgQBAgIDBgoCBAQNBgIGAgUcCAQIAgZ+BgwCBgEGAgQHBAYBAQQLAwkDBgIFBg4NowsaBgYTBwcRBQk6BQIDBAgOAQIMDQwUCAcEAgcJBwcBBBEICAoBAQYICyE6KHsCASIXFzoREiIHBw8FBAUBEgtxIwoFCAQCBg4JEAIEDQEdFUBSFiEBATdCBgUEJCYMKxITNxUwJhMJDQEQDJ4GEAoIAwULBgUBAwYODxIHBgUHAwYDAgUEAwICAgsFJAMEBQMFAgEBAQIGA/3bBQcFBAUIBbYBAQUIEwkJBwQEDQkEBAMEBQYDAwEDBAYDAwFBGyd4BAEEKQIBAwMCAgsGCgYBBgIFLAICBAYDBAECBgIDMAkhDg8UAScbQQEBAQESBw0BAwUCAg4GEAYNAQIEDhIRCAcEAgkGBAMCAgsGBQYECAEKAwQEBQICAxAHDQMBAwMCAgQDBQECARgDAQICBgIFCP1ZLWEPHwcGDAIBFQ0OFAkGBhIGBhUICBACAiQXFzMMDRKcgDszNE0XFgGBExIFBwUNCgYJDAsJBggRBAYECQwKFREKCQcpBQYBCAcJDwQDAQEDAQUCBA8EUAYDBAI5FBANBQoOFA4sCAgBBwEECBEcAwIQEwsPAQMCAQMBAwwhFhkC/uYODiYTEwwRCQIBGRISIwgWNDRsKSkEAwMRCAgWBwYMAQNACwUPBQYbDh8IAUEMGQYDBAYXDAkEAQMQCwkOCA4PBggEBgcECQIDAgEDAQIMBQQSBg4EBwUGCBADAgEDBA45BQQDBAUHBggCBgYJBQI7IUQIBBULDCQOIggBMSMiejNMMgICBxUMFgMEGA4OFAETDAcBBAECAwkFCAEKBxIXCQUIAQYlEgYKAwQGDgEBBAIDGBAKEQIGDAEBAQEtBAMLBP1TAQIFAwIFAgIEOzJkSyspFAcKAQEBwU91AgMTGrQEBQoHBwoNDwkJBAcCBAcFCgUCAQIISQ8dAQEBAwIFBgYJBhAdAQEBAwQVCg8CEAcGCQENBgYLAQFHT3IBAQEBAQEeFBUqChd6DgckFBMdAT6LAgICAwYNCAsFAwsFBQYnEQUCAQICAwQHCQ4DAwUKCwEHBQkVFwoBUgoGDAsJAwoEDAQHAwUFCAwFCQEDFzsCFAwTGQ4DEgoULhcHHg0OFAEBAQEFBAQQCRBUT0MRAwKNDBUTCgcFBQMDAQYGCQEBAQIBBAYJAQMDBQYEAhUUDgMCAwEuEAoECQMGGwEFAQQNBQICAQEUDx8LAQEBAS8lEQMEBGkHDgQECgQECgMFIgMBAQcFBxQLDAsBBgYFCAkHCAsJCQYDAwoJChIiFwEBNiUZGT8TEyUIBxEFBAYJB3kCKQoFAQICCREKEAEDAQJrF0VaGCMWHQIDAhUWBxkLCiAMHBYLBQcSDHEGBgQBAQIJBwcZEwcCBAcQEgEBAgcEBgEBAgEBBAQDBgICAwQZAQMBBgQGAQMGEAIBEgMKAgIBAgIJAwQBYQEsJ1EEBgIJCRsQDw8DAwUMBgUUBQUCBAYH8cRQcwEBMgECVQMJBQUCAgEIBQgGBAURAiQCBRAJBAcCAQJNBA4GBgl0UcRvLkYDCBEHCwEBBwgHDgUPBQxRORkCAwIIVQggDAkJAwcJCQEBBgkTIAkDAQEBBgwGBxsGBwICAwUOAwITBAgFBQEEBxJQAU+nGjUMDRQCAiUYFyEOCwoeCwskDg8aBAQ+KChXFhYgAQEBVgomHhEYDAkMBQMBAQMEEQgLFRIZHA0LCAECBCEFEg4VHgMECAsGDA0OCwcEBwIEAQMiAxAJBgERDg8KEycJBgMHCBIIAgQICQ0GEhEKEAMFEwQCBQEDAQEBQwEpKW86OSIzHgEBBQICBQEDBwcOBQYBBwYFHA8OJgwLFAIEbxQJGgkJLxg3DQMBAgYhEAoWBgsJBAMBCAwOBwgNHg8KDgYDAgEBAQIHBAkCBAoCAgMDIgIKBAkKAwQDBwUIBggIJgIIBgMGBAUCAgMXBAQBAf7sOXYOBiUTFD8YOw8GBQUQBwoHAgIaPyRBCglJKSk7AR4WwAEFAgMGDggLAQQDCAIEAwsFFDwKBgQDAwQRBQMHCAYEBgkGAwYBBEIEAgEDdAIGAgQICQUDBQIEAWgdOisZGAwEBSkuWBkLDwEMDxkCAQEVDw8XAgUBBwQJBQQBAwEBDwoTDQICAgwIKBAFBQMEAQIDCCgRBwUCBAEFDwUgBgUGBRoGBQMDNQoQASQzKC8RDAsZBg1GCQMWCwsQAQEIExsBBQMEAwICAgEDAgcNCg0UAgIDAgUCBAEBBQQFBwgJCgcFBAQFAQMLARYPHRADAQEBBggEAhsLEgEEBgIAAgBE/8ADvAPAAAYAEgAACQETBQEDJQczFTMVIxUjNSM1MwH//kUBAbwBuwH+RC9g0NBg0NADwP7//gD/AQECAP/71WDV1WAAAgBE/8ADvAPAAAUACQAACQETBQEDBxUhNQH//kUBAbwBuwG7/gADwP7//gD/AQECANFgYAAAAAABAAH/3gQAA6MArgAAFy4BJy4BNTYmJy4BJyY2Nz4BPwEnLgEnLgEnLgEnNCYnJjY3PgE1NDY3PgE3PgEXHgEXHgEfATc+ATc2Nz4BNzY3PgEXHgEHBhYXHgEfAQcOAQcGBw4BBwYHBhYXFhceARcWFx4BFx4BBw4BBwYWFx4BFRYGBw4BBw4BIyIGBw4BJyYGBw4BIy4BJy4BIyImJy4BJy4BLwEHBgcOAQcGBw4BBw4BBw4BJyYGBwYmJyQDCwQGAgECAgIDAQIDBgNfQZwsKVUgFBUMEAUBAwIGBwoFBwkNCwgFCjIiDBYVLV00QwwEMR0gISA9GRkRKUMNBQEBAQEEAhIKGQkGGh4aLCtcKCgSAwUMExoZOBsbFA0WAgICAgECAQECBgMFAhgKBREHBhAEBggFBgcEBAYDAwoPFBADAgcDBxUnHkIhDRcDBwoFGxtHJiYbFygEBQgCBCkBAQgFDBAIIQQOBwkNDgoOAgINCAoMCgZhQZonJUQWDRMQFRUvBwoCBB8KBQsDCAkFBAcKFQ4KAw4SJlUyQgkELBscHR00FRYMIBgNBQsREAoBARAKGhEKGhkWJiZQJCQRAgoOFSEgSCUkHhMdAgIHBQQOBgsGAgIFAgccBAIIBAMFBQcHBAEBAwQFAwEFBwIEGTYpVicQHAMJCAQZGUMkJRoXIgICBQIFFQIBBAQIAQgAAAAAAQAAACUD/QNgAGwAACUuAScmJy4BJyYnLgE1NDY3NjQvATc+ATMyNjc+AT8BFx4BFxY2Nz4BFx4BFx4BNz4BNzY3PgE3Njc+ATc+ATMyNjc+AT8BFx4BFx4BFxYUBw4BFRQGBwYHDgEHBgcOAQcOAQcOASMiBgcGJicBdR4THhogIEYjJCAMEAMDBQcHCAMHAgEHAgMNBhETCREECQ8NCgcHGzVYERAIARUNDxkYNxsbFDx6PRoXBgQIAwILBg8HAw0FDQ4DAwQDAxMnU0lKeS0tGQYMAwMLBAQIAgIKBAsSEygKFDEsLy9cKysjDBIBAQUDBwoHBwsFBgMCAgcDBgcDBwIEAQUEAQQMMWASCAYCFw8SGRo2GhkSNF4pEg0DAwIGAgUJAwkCBw8OCwYDAgYDBRcrW1dXnUJDMQsTAgIIBAQGAwMGAQgAAAAFAAL/wAP9A78AQwBxAI0AnQCtAAABIgYHBgcOAQcGBwYHDgEHBgcGFBceARcWFx4BFxYXHgEXMhYXMjY3PgE3Njc+ATc2Nz4BNzY0Jy4BJyYnLgEnJicuAQcyFhcWFx4BFxYXHgEHDgEHDgEHDgEnLgEnJicuAScmJyY2NzY3PgE3Njc+ATMHETMyNjc+ATU0JicuASc+ATc+ATU0JicuASsBFzMyFhceARUUBgcOASsBNRUzMhYXHgEVFAYHDgErATUB/xohFSgmJ0chIB0gGRklDAwEAgIFGhYTGBg6IiEmKVssBgwCB0EKL1cpJSIhOhgZEhYaBgEBByIeHSYnXDQ1NxYgGzRdLiwlJTkUFAkFAwMJPjIzfEcOMgwtUigrJSY6ExQJCQMLDxwdTjExOBoyHfP+O1gdHR0ODQ4mGBMdCgsKHBwbWj3mmVQTGwkKCQkKCRsTVFoXIwsMCwwLDCIXWgO/AgQGDQwlGBcdICQjTisqLg5HDjNYKyUhIToYGBIVGgQBAQEBBRkVEhgYOiEhJStYMw5HDjxnMzAoKT8UFQkEAloWFxYgH0wtLC8dRxtJfzMyPQkCAgEDFhQWHx9NLC0wLGErODExThwdDgcGpf4AEhITNyUYKRARFwYGFA0NIBMjNBAQEFoHBwcUDQ0VBwYHbMYICQgZEREZCAkIhgABAAD/wAQAA4AALAAAATIXHgEXFhUUBw4BBwYjIiYnBgcOAQcGBzU+ATU0JicmJy4BJyY1NDc+ATc2AgBqXV6LKCgoKIteXWoUKBQpLS1dMDAwM00BASwjIzEODSgoi15dA4AhIHFMTFZWTExxICEDAikaGR0FBQIbGlc0Bw8HHCQkUi4uMVZMTHEgIQAAAAABAEAAAAPAA0AAJAAAJTU+ATU0Jy4BJyYjIgcOAQcGFRQWFxUGBw4BBwYVITQnLgEnJgJANUsDAyQnJ0hIJyckAwNLNVFHRmceHQOAHR5nRkf9NR6GSjw0NU4WFxcWTjU0PEqGHjUGFxZDKywwMCwrQxYXAAIAEv/AA+4DwABCAF4AAAEmJyY2NzY3Jw4BIyInLgEnJjUjFAYHBgcOAScmJwceARcWFxYGBwYHFz4BMzIXHgEXFhUzNDY3Njc+ARcWFzcuAScFIicuAScmNTQ3PgE3NjMyFx4BFxYVFAcOAQcGA6YUBQQTGBcjZRUyGygjJDUPD8kNDRUfH0gnJiNlFiUNFAQFFBcXI2UVMhooJCM1DxDJDQ0UHx9JJiYkZBUlDf5aKyYlORAQEBA5JSYrKyYlORAQEBA5JSYBXiMmJkkfHxSvDQ4PEDUkIykZMhcjFxcTBAUUrg0kFyMmJkggHxSuDA4PEDUjJCgZMRcjFxcTBAUUrwwkF20QEDklJisrJiU5EBAQEDklJisrJiU5EBAAAAYAAP/ABAADwAAnADMAPwBLAFgAZQAAASMmJy4BJyYnNSMVBgcOAQcGByMVMxYXHgEXFhcVMzU2Nz4BNzY3MycjLgEnNRYXHgEXFgUiJjU0NjMyFhUUBgMVDgEHIzY3PgE3NgMzHgEXFSYnLgEnJicFNT4BNzMGBw4BBwYHBABlCh8eXDo7Q4BDOzpcHh8KZWUKHx5cOjtDgEM7OlweHwpl52QOPikoJCM5FBT+8BslJRsbJSVbKT4OZAkUFDkjJLFkDj4pKCQjORQUCQFZKT4OZAkUFDkjJCgCAEM7OlweHwplZQofHlw6O0OAQzs6XB4fCmVlCh8eXDo7Q4ApPg5kCRQUOSMkqCUbGyUlGxslAVlkDj4pKCQjORQU/rApPg5kCRQUOSMkKNlkDj4pKCQjORQUCQAAAAEAAAABAAA9FOCfXw889QALBAAAAAAA3HPIQwAAAADcc8hDAAD/wAUAA8IAAAAIAAIAAAAAAAAAAQAAA8D/wAAABQAAAAAABQAAAQAAAAAAAAAAAAAAAAAAAFUEAAAAAAAAAAAAAAACAAAAAwoABAQAAAEEAAAAArgAAAL2AAAEAAAABQAAAAGaAAADHwAkBAAAGAQAAAAEAAAABAAABQQAABAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAUEAACnBAAAwAQAAAAEAAAFBAAAAAQAAAAEAAAABAAAAQQAAAMEAAAABAAACgQAAEgEAABDBAAACwQAAEMEAACRBAAAAAQAAPUEAAA0BAAAAAQAAEEEAAAABAAAAgQAAAIEAAArBAAAAgQAAAIEAAACBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAEBAABYAQAAAEEAACpBAAAEAQAAAAEAAAABAAABQQAAAIEAAA5BAAABQQAABQEAAA/BAAARAQAAEQEAAABBAAAAAQAAAIEAAAABAAAQAQAABIEAAAAAAAAAAAKABQAHgEiAYABsgIeAmIDaAPYBBgEugVUBgAGbAdoB94IkAl8CigKxgtqDBoOQA+CD8wQXhLGFKoVbBWUFewXthfuGLIalhwCHsIe5h94IIIhOCFkI+YkmCTkJTYmACcCKMQqFCr+K4AsPi0CLgouvC92L9gwfjEGMdQy6jMaNLA1DDgiPGg8tj4SP5pBukQIR7RNaE2MTahOsk9YUFpQolDcUWxSCAABAAAAVQP2ACIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEABQAAAAEAAAAAAAIABwBOAAEAAAAAAAMABQAwAAEAAAAAAAQABQBjAAEAAAAAAAUACwAPAAEAAAAAAAYABQA/AAEAAAAAAAoAGgByAAMAAQQJAAEACgAFAAMAAQQJAAIADgBVAAMAAQQJAAMACgA1AAMAAQQJAAQACgBoAAMAAQQJAAUAFgAaAAMAAQQJAAYACgBEAAMAAQQJAAoANACMZ2x5cGgAZwBsAHkAcABoVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwZ2x5cGgAZwBsAHkAcABoZ2x5cGgAZwBsAHkAcABoUmVndWxhcgBSAGUAZwB1AGwAYQByZ2x5cGgAZwBsAHkAcABoRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('woff');
  font-weight: normal;
  font-style: normal;
  font-display: block;
}

[class^="icon-"], [class*=" icon-"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  line-height: 1;
  padding: 0px 1px 0px 1px;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.icon-bludgeoning:before {
  content: "\e927";
}
.icon-piercing:before {
  content: "\e92d";
}
.icon-slashing:before {
  content: "\e932";
}
.icon-acid:before {
  content: "\e926";
}
.icon-cold:before {
  content: "\e928";
}
.icon-fire:before {
  content: "\e929";
}
.icon-force:before {
  content: "\e92a";
}
.icon-lightning:before {
  content: "\e92b";
}
.icon-necrotic:before {
  content: "\e92c";
}
.icon-poison:before {
  content: "\e92e";
}
.icon-psychic:before {
  content: "\e930";
}
.icon-radiant:before {
  content: "\e931";
}
.icon-thunder:before {
  content: "\e934";
}
.icon-circle:before {
  content: "\e91c";
}
.icon-cone:before {
  content: "\e91d";
}
.icon-cube:before {
  content: "\e920";
}
.icon-cylinder:before {
  content: "\e921";
}
.icon-sphere:before {
  content: "\e922";
}
.icon-square:before {
  content: "\e923";
}
.icon-line:before {
  content: "\e91e";
}
.icon-wall:before {
  content: "\e925";
}
.icon-action:before {
  content: "\e935";
}
.icon-bonus-action:before {
  content: "\e950";
}
.icon-reaction:before {
  content: "\e936";
}
.icon-round:before {
  content: "\e937";
}
.icon-ac:before {
  content: "\e900";
}
.icon-hp-empty:before {
  content: "\e938";
}
.icon-hp-full:before {
  content: "\e939";
}
.icon-hp-half:before {
  content: "\e93a";
}
.icon-hp-temp:before {
  content: "\e93b";
}
.icon-melee:before {
  content: "\e93c";
}
.icon-ranged:before {
  content: "\e93d";
}
.icon-spellbook:before {
  content: "\e90c";
}
.icon-spell:before {
  content: "\e919";
}
.icon-saving-throw:before {
  content: "\e93e";
}
.icon-skill-check:before {
  content: "\e940";
}
.icon-abjuration:before {
  content: "\e90e";
}
.icon-conjuration:before {
  content: "\e90f";
}
.icon-divination:before {
  content: "\e910";
}
.icon-enchantment:before {
  content: "\e911";
}
.icon-evocation:before {
  content: "\e912";
}
.icon-illusion:before {
  content: "\e913";
}
.icon-necromancy:before {
  content: "\e914";
}
.icon-transmutation:before {
  content: "\e915";
}
.icon-octagon:before {
  content: "\e916";
}
.icon-concentration:before {
  content: "\e917";
}
.icon-ritual:before {
  content: "\e918";
}
.icon-touch:before {
  content: "\e91a";
}
.icon-upcast:before {
  content: "\e91b";
}
.icon-advantage:before {
  content: "\e94b";
}
.icon-disadvantage:before {
  content: "\e94c";
}
.icon-cross:before {
  content: "\e94d";
}
.icon-tick:before {
  content: "\e94e";
}
.icon-d4:before {
  content: "\e945";
}
.icon-d6:before {
  content: "\e946";
}
.icon-d8:before {
  content: "\e947";
}
.icon-d10:before {
  content: "\e948";
}
.icon-d12:before {
  content: "\e949";
}
.icon-d20:before {
  content: "\e94a";
}
.icon-roll-dice:before {
  content: "\e909";
}
.icon-dnd:before {
  content: "\e943";
}
.icon-al:before {
  content: "\e942";
}
.icon-person:before {
  content: "\e907";
}
.icon-location:before {
  content: "\e904";
}
.icon-organization:before {
  content: "\e906";
}
.icon-time:before {
  content: "\e90d";
}
.icon-terrain:before {
  content: "\e944";
}
.icon-light:before {
  content: "\e903";
}
.icon-monster:before {
  content: "\e93f";
}
.icon-book:before {
  content: "\e901";
}
.icon-loot:before {
  content: "\e905";
}
.icon-potion:before {
  content: "\e908";
}
.icon-scroll:before {
  content: "\e90a";
}
.icon-distance:before {
  content: "\e902";
}
.icon-search:before {
  content: "\e90b";
}
.icon-instantaneous:before {
  content: "\e91f";
}
.icon-not-applicable:before {
  content: "\e924";
}
.icon-bubble:before {
  content: "\e96b";
}
.icon-self:before {
  content: "\e971";
}
.icon-cog:before {
  content: "\e994";
}
.icon-target:before {
  content: "\e9b3";
}
R0lGODlhAAEAAaECAAEBAZGRkQAAAAAAACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8eyBdT2Xc/6zr/4Dwz2hsQiJYhMAo3MZk8Jjd6c1CpKis0CrNyuRgvGesfkRvgsLqu96HZ6DWe659K4nUfPR+98mP6v1CeoAliYNIg4YrgolOi4wRi59EhZIXmJU6kJgdlpswmq4Dm6FWpKOmoKipqqWslK6voIiyqLSMtqK4hbq3sXa9bpG9cacTkMJ0wTiVyG+cXYTHYMGS3NRc1hfV0lCbLI3c0cAh7e5C1iaH6+TV64bjROog4/JK/4Xv9UbpKvv9NuHqB/AAPi+0NQx70S/hL64HeiocMWBgUinPiQ3pX+gRhdVDyop6NHiP04ilzxMZ3JkxtJMlzJsqRLiyFjttSIoNQ3mDZBCkGzQOcHiT1VHgpwRpRQD0SL7kRyIGmCHO4uOqX5I6pUrUZrXvU5JSeYqVQflDXb9GsHqGK1kF3K4KwDnGqHNmr7xkDYuXDj8qy7dtLbvEg/8e0b9C/galkT18GLWKtcx1YXMxU8GErmyIUnK1VsGcPdz5ohc94bDHToC5g3s5WMOvPhyqu1ZZp9FLZhyqfT1mZ9Oyrp13pb60Y887fo2HD3mN5t2q9q5ZaYNw/03LPx5NSXQS/Mu3Fx4uODl6fdPYP1vrk7jz7/3X2e9JflxoYPvXT24XP+6NeXzd9Zzh0XH3r+AbeUeM+5pqB88Tm41YHVuCadfQPix15/Eq7FYIUMtvYehoRtqJ5Q5In1IYjGQTgiiaKlGFeKKjYoInYudrVigDZiGN6FN9q1Y4WPEZhhiz8GFqSOQYbIIpNH2uZjdvrxqKR5T6LFZBapablflZ5dueVRbgk5JIE93gcmlr6NRaGSaXpHF5Ht4Xfmm3DG2eSJK9JopzEL1Ujeng/2yUk2cs4pKGeEhklShBAGtehyhjrqZKR3tkNpjrPI4smhO56YyKCaFAOUnJSIugkwbUgZKqqpqlqqiLugqUovbpjKh5W25KJhk3ZoKiOfTvByq6xrAAv+aJRFEKvhnF2AiqdCzNJhrD2K2vgMHtNSm6e1uE07w7YXOevHl3kSm5G4IZE7UmTqVorju3tgxy4htMoLb320kKnfIfXeVCS++ZaYyxE+/vTvS1YKrCw0nU7g6LkDx1tWrMmiA6UyhRYrZcJVcaxmLwRrzCjIniL7MZvf8jKyoWdyG6yuCo9ZsrjVkfzyfDmjjKSRF28LMc5eetUxz4w1/HMxc22cLb9/SkwrkFPG/PA3fvZ69Z9czgxq0k/HsKqkcfrcc6XoxhNGxg2RfbSmaa/ssbQqi80sVsLSbHDXaGMNN8tgibo13eayY/LOuPztbplQqhF2yPKmPGjgriT++DbTDCuaN+CKT24h20Vv7jjeOWX+peevrDd16EjfLDpXEsgM9eCvoq6307ULPqLseNVs9CwNJjnV0FGrndfwb9neuyOjJTyZzg7TDPtnyAsbynu1P+ib6hH7NX30q1hPvXzCt/66gUp1b/yogUZPY7SW8x3j+Omfiiiq22luOvr5Gx6++vUnrqKgpU4v2tte1kBXvSWV7nbl09u1zFfAifluSbzTXQPdhjmvMVB+85tg3CT2FPZlkH/e018JTzdAqmmvZKl5HvD69kHlIfBk5kohfMLkwuTF7oQotKHkTuY43OSQhzTsn/98+MPV3ZB3l+qgBl3VwxTObYYAqmD+/zb4RAvSD3SVo2IVTRi13lmMc7l72/7EEzAjGbGIOhzEFIGyv26RUGZrzOIIPTgkoRUQhiEi4g7rKMMx6XGPfGwfFNkIyEBqaZCELOR9DmnHOyrycU08ZBkFWLldCQx3WvxZy8hXK3x9EpI0HGUcWyVKBEkQiKqcmyYp2cpEgrCSXpwdLGlJymTh0oYJvCXrsBVBSUayGamMpRJ1uctVblFdnHyh8JrZRlRSpW6tLNoFnenITm7xc00rGyCd90xiXudwUvNjJDGIxVHNkTvG1OY5nZROTvnNm7lEpBqj2UtYhLCeVHPlEusxT+IRj2i6+UdAn1dOxbiTjPq0DeL+CCocfRx0WV8zKDkJV9F1nA2jGQ3HRPeGMYvuywqM5MZHQeoyj54UpSFV6UVJWjWXNpQNMZ3HNF76rJqqZAwrFUdJGfNLYbatYIzTqb4qCTCiFvWndMMl15S61G7qS6g1eqhRb8rUoEKTqtnsKE2zesCFspKewMjVVYMq1tiRVWlsACP80JpWtQ5VZDzVzlnD6sTxzZWu2LjXXa1oSnz+0asU9StYx5rMvHJTqj6FHVsdOcR42jMlLKXjY/sZWckOlrKFhRZfMwnXGL4TgkTg4uVkuVjFAq2xUjwtPycrydUOC5SujasB15nS0vpztIfloBNtxlHyuTawvOxnbrX+1bjUjrSdx4QtZ8v1VoYRt7jKZWy4ILrZv3ZVgszch4GKGdr8vQu5RPElJsfoVuu2yyXdTWxzzUuRp7WXdMm14nLXmxzZ0re+6dWuVcFp3Jbilb/97e1aSUvN/RauwAaeLnar6z4GYxPCZX0qZ3vqW1BmmK/7FPCGH/xhDYfYv+4FMYW/W+Fggmuq6h1xbanr3JlulZ0BfvEPt7vi86YYxzaOY49FiOEa/3jCLh5yb41sYgkj2cM8XnIbnTze8EIZxkWeMmmV7OQZW7nFTd6ylrdMWNyCObNgZvKAy6zMKqNZxF2e8kDXTOM2Z/nNcJ6OitfM4jpf+X30mnOeY6zhZ64iEtAJ/jOh8bzXuyzZJ2q28oHNg2SsiBnOeV7ekGWCnEBT+Zp97HFL7KtnyN2vtijpjaZRy2fLDpcFNTy1OXXMp1V7RM6XtptjNxncOmM6R+AF2539bOsw6hemlE5BvYJMhWIb+3phTsaYWQ2v484KytAtIZd/Aez4XrHBdf2x3NJ32WnL+tsW5HAfSG0tcOM0os7AdWczGGVnDxuknF73sTZK7HpD1aw77usIkU0MabcV1te+xZ6jKHBb3tgX3LZUtbPncDnYOeKzJTDFo9rci/8qrhrvuMc/DvKQq6EAADs=
/*\
title: dnd.range.js
type: application/javascript
module-type: macro
A Tiddlywiki macro for calculating average dice result
\*/
(function() {

    /*jslint node: true, browser: true */
    /*global $tw: false */
    "use strict";

    exports.name = "dnd.range";

    exports.params = [{
            name: "range",
            default: ""
        }
    ];

    /*
    Run the macro. Make sure it accepts the parameters you have defined above.
    */
    exports.run = function(range) {
        try {
            var regexp = /^([\/\d]+)$/i;
            var match = range.trim().match(regexp);
            if(!match) {
                return range;
            }
            return range + "'";
        } catch (err) {
            console.error(err.stack)
            return "(ERROR: " + err.message + ") ";
        }
    };

})();
You attempt to beguile a beast that you can see within range. 
It must succeed on a W isdom saving throw or be [[Charmed]] by you for the duration. If you or creatures that are friendly to you are fighting it, it has advantage on the saving throw. 

While the beast is [[Charmed]], you have a telepathic link with it as long as the two of you are on the same plane of existence. You can use this telepathic link to issue commands to the creature while you are conscious (no action required), which it does its best to obey. You can specify a simple and general course of action, such as “Attack that creature,” “Run over there,” or “Fetch that object.” If the creature completes the order and doesn’t receive further direction from you, it defends and preserves itself to the best of its ability. 

You can use your action to take total and precise control of the target. Until the end of your next turn, the creature takes only the actions you choose, and doesn’t do anything that you don’t allow it to do. During this time, you can also cause the creature to use a reaction, but this requires you to use your own reaction as well. 

Each time the target takes damage, it makes a new Wisdom saving throw against the spell. If the saving throw succeeds, the spell ends.
You attempt to beguile a creature that you can see within range. 
It must succeed on a Wisdom saving throw or be [[Charmed]] by you for the duration. If you or creatures that are friendly to you are fighting it, it has advantage on the saving throw. 

While the creature is [[Charmed]], you have a telepathic link with it as long as the two of you are on the same plane of existence. You can use this telepathic link to issue commands to the creature while you are conscious (no action required), which it does its best to obey. You can specify a simple and general course of action, such as "Attack that creature", "Run over there", or "Fetch that object". If the creature completes the order and doesn’t receive further direction from you, it defends and preserves itself to the best of its ability. 

You can use your action to take total and precise control of the target. Until the end of your next turn, the creature takes only the actions you choose, and doesn’t do anything that you don’t allow it to do. During this time, you can also cause the creature to use a reaction, but this requires you to use your own reaction as well. 

Each time the target takes damage, it makes a new Wisdom saving throw against the spell. If the saving throw succeeds, the spell ends.&nbsp;
You attempt to beguile a humanoid that you can see within range. 
It must succeed on a Wisdom saving throw or be [[Charmed]] by you for the duration. If you or creatures that are friendly to you are fighting it, it has advantage on the saving throw. 

While the target is [[Charmed]], you have a telepathic link with it as long as the two of you are on the same plane of existence. You can use this telepathic link to issue commands to the creature while you are conscious (no action required), which it does its best to obey. You can specify a simple and general course of action, such as “"Attack that creature",” "“Run over there",” or "“Fetch that object".” If the creature completes the order and doesn’t receive further direction from you, it defends and preserves itself to the best of its ability. 

You can use your action to take total and precise control of the target. Until the end of your next turn, the creature takes only the actions you choose, and doesn’t do anything that you don’t allow it to do. During this time you can also cause the creature to use a reaction, but this requires you to use your own reaction as well. 

Each time the target takes damage, it makes a new Wisdom saving throw against the spell. If the saving throw succeeds, the spell ends.&nbsp;
"""
''Shapechanger.'' The doppelganger can use its action to polymorph into a Small or Medium humanoid it has seen, or back into its true form. Its statistics, other than its size, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Ambusher.'' In the first round of a combat, the doppelganger has advantage on attack rolls against any creature it surprised.
''Surprise Attack.'' If the doppelganger surprises a creature and hits it with an attack during the first round of combat, the target takes an extra <<damage 3d6>> from the attack.
"""
<<divider>>
''Multiattack.'' The doppelganger makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +6>>|<<bludgeoning 1d6+4>> |<<reach 5>> |
| !Read Thoughts|The doppelganger magically reads the surface thoughts of one creature within <<range 60>> of it. The effect can penetrate barriers, but 3 feet of wood or dirt, 2 feet of stone, 2 inches of metal, or a thin sheet of lead blocks it. While the target is in range, the doppelganger can continue reading its thoughts, as long as the doppelganger’s concentration isn’t broken (as if concentrating on a spell). While reading the target’s mind, the doppelganger has advantage on Wisdom (Insight) and Charisma (Deception, Intimidation, and Persuasion) checks against the target. |<|
<$button class="btn-download">
<$action-sendmessage $message="tm-download-file" $param="$:/core/save/all" filename="tw-dnd.html"/>
Download Wiki {{$:/core/images/save-button}}
</$button>
You have draconic ancestry. Choose one type of dragon from the [[Draconic Ancestry Table]]. Your breath weapon and damage resistance are determined by the dragon type, as shown in the table.

{{Draconic Ancestry Table}}
| !Dragon | !Damage Type | ![[Breath Weapon]] | !Save |
|!Black	 | Acid		 | 5 by 30 ft. line | Dex |
|!Blue	 | Lightning	 | 5 by 30 ft. line | Dex |
|!Brass	 | Fire		 | 5 by 30 ft. line | Dex |
|!Bronze	 | Lightning	 | 5 by 30 ft. line | Dex |
|!Copper	 | Acid		 | 5 by 30 ft. line | Dex |
|!Gold	 | Fire		 | <<cone 15>> | Dex |
|!Green	 | Poison		 | <<cone 15>> | Con |
|!Red	 | Fire		 | <<cone 15>> | Dex |
|!Silver	 | Cold		 | <<cone 15>> | Con |
|!White	 | Cold		 | <<cone 15>> | Con |
Your innate magic comes from draconic magic that was mingled with your blood or that of your ancestors. Most often, sorcerers with this origin trace their descent back to a mighty sorcerer of ancient times who made a bargain with a dragon or who might even have claimed a dragon parent. Some of these bloodlines are well established in the world, but most are obscure. Any given sorcerer could be the first of a new bloodline, as a result of a pact or some other exceptional circumstance.

<<include "Draconic Bloodline Advancement Table">>

---

!! Draconic Bloodline Abilities

<<vtabs "[[Dragon Ancestor]] [[Draconic Resilience]] [[Elemental Affinity]] [[Dragon Wings]] [[Draconic Presence]]">>

---

<<include "Sorcerer Ability">>
| !Level | !Proficiency Bonus | !Sorcery Points | !Features | !Cantrips Known | !Spells Known | !—Spell Slots per Spell Level— |<|<|<|<|<|<|<|<|
|~|~|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 | — |[[Spellcasting|Sorcerer Spellcasting]], ''Draconic:'' [[Dragon Ancestor]], [[Draconic Resilience]] | 4 | 2 | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 | 2 |[[Font of Magic]] | 4 | 3 | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 | 3 |[[Metamagic]] | 4 | 4 | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 | 4 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 5 | 5 | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 | 5 | — | 5 | 6 | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 | 6 |''Draconic:'' [[Elemental Affinity]] | 5 | 7 | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 | 7 | — | 5 | 8 | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 | 8 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 5 | 9 | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 | 9 | — | 5 | 10 | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 | 10 |[[Metamagic]] | 6 | 11 | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 | 11 | — | 6 | 12 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 | 12 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 12 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 | 13 | — | 6 | 13 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 | 14 |''Draconic:'' [[Dragon Wings]] | 6 | 13 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 | 15 | — | 6 | 14 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 | 16 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 14 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 | 17 |[[Metamagic]] | 6 | 15 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 | 18 |''Draconic:'' [[Draconic Presence]] | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 | 19 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 | 20 |[[Sorcerous Restoration]] | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
Beginning at 18th level, you can channel the dread presence of your dragon ancestor, causing those around you to become awestruck or frightened. As an action, you can spend 5 sorcery points to draw on this power and exude an aura of awe or fear (your choice) to a distance of 60 feet. For 1 minute or until you lose your concentration (as if you were casting a concentration spell), each hostile creature that starts its turn in this aura must succeed on a Wisdom saving throw or be charmed (if you chose awe) or frightened (if you chose fear) until the aura ends. A creature that succeeds on this saving throw is immune to your aura for 24 hours.
As magic flows through your body, it causes physical traits of your dragon ancestors to emerge. At 1st level, your hit point maximum increases by 1 and increases by 1 again whenever you gain a level in this class.

Additionally, parts of your skin are covered by a thin sheen of dragon-like scales. When you aren’t wearing armor, your AC equals 13 + your Dexterity modifier.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +6>>|<<bludgeoning 2d4+4>> |<<reach 5>> |

Dragons are large reptilian creatures of ancient origin and tremendous power. True dragons, including the good metallic dragons and the evil chromatic dragons, are highly intelligent and have innate magic. Also in this category are creatures distantly related to true dragons,
but less powerful, less intelligent, and less magical, such as wyverns and pseudodragons.

<<list-box "[tag[Dragon]sort[]]" "No dragons found.">>
At 1st level, you choose one type of dragon as your ancestor. The damage type associated with each dragon is used by features you gain later.

!!! Draconic Ancestry

| !Dragon | !Damage Type |
| !Black | Acid |
| !Blue | Lightning |
| !Brass | Fire |
| !Bronze | Lightning |
| !Copper | Acid |
| !Gold | Fire |
| !Green | Poison |
| !Red | Fire |
| !Silver | Cold |
| !White | Cold |

You can speak, read, and write Draconic. Additionally, whenever you make a Charisma check when interacting with dragons, your proficiency bonus is doubled if it applies to the check.
Dragon scale mail is made of the scales of one kind of dragon. Sometimes dragons collect their cast-off scales and gift them to humanoids. Other times, hunters carefully skin and preserve the hide of a dead dragon. In either case, dragon scale mail is highly valued.

While wearing this armor, you gain a +1 bonus to AC, you have advantage on saving throws against the Frightful Presence and breath weapons of dragons, and you have resistance to one damage type that is determined by the kind of dragon that provided the scales (see the table).

Additionally, you can focus your senses as an action to magically discern the distance and direction to the closest dragon within 30 miles of you that is of the same type as the armor. This special action can’t be used again until the next dawn.

| !Dragon | !Resistance |
|!Black |<<acid Acid>> |
|!Blue |<<lightning Lightning>> |
|!Brass |<<fire Fire>> |
|!Bronze |<<lightning Lighting>> |
|!Copper |<<acid Acid>> |
|!Gold |<<fire Fire>> |
|!Green |<<poison Poison>> |
|!Red |<<fire Fire>> |
|!Silver |<<cold Cold>> |
|!White |<<cold Cold>> |
You gain a +1 bonus to attack and damage rolls made with this magic weapon.

When you hit a dragon with this weapon, the dragon takes an extra <<damage 3d6>> of the weapon’s type. For the purpose of this weapon, “dragon” refers to any creature with the dragon type, including dragon turtles and wyverns.
"""
''Amphibious.'' The dragon turtle can breathe air and water.
"""
<<divider>>
''Multiattack.'' The dragon turtle makes three attacks: one with its bite and two with its claws. It can make one tail attack in place of its two claw attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +13>>|<<piercing 3d12+7>> |<<reach 15>> |
| !<<melee Claw +13>>|<<slashing 2d8+7>> |<<reach 10>> |
| !<<melee Tail +13>>|<<bludgeoning 3d12+7>> |<<reach 15>> |
|~|If the target is a creature, it must succeed on a <<save Str 20>> or be pushed up to 10 feet away from the dragon turtle and knocked [[Prone]]. |<|
| !Steam Breath|''Recharge on 5–6''<br/>The dragon turtle exhales scalding steam in a <<cone 60>>. Each creature in that area must make a <<save Con 18>>, taking <<fire 15d6>> on a failed save, or <<Halved>> on a successful one. Being underwater doesn’t grant resistance against this damage. |<|
At 14th level, you gain the ability to sprout a pair of dragon wings from your back, gaining a flying speed equal to your current speed. You can create these wings as a bonus action on your turn. They last until you dismiss them as a bonus action on your turn.

You can’t manifest your wings while wearing armor unless the armor is made to accommodate them, and clothing not made to accommodate your wings might be destroyed when you manifest them.
Your draconic heritage manifests in a variety of traits you share with other dragonborn.

|^!Age |^Young dragonborn grow quickly. They walk hours after hatching, attain the size and development of a 10-year-old human child by the age of 3, and reach adulthood by 15. They live to be around 80. |
|^!Alignment |^Dragonborn tend to extremes, making a conscious choice for one side or the other in the cosmic war between good and evil (represented by Bahamut and Tiamat, respectively). Most dragonborn are good, but those who side with Tiamat can be terrible villains. |
|^!Size |^Dragonborn are taller and heavier than humans, standing well over 6 feet tall and averaging almost 250 pounds. Your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Languages |^You can speak, read, and write Common and Draconic. Draconic is thought to be one of the oldest languages and is often used in the study of magic. The language sounds harsh to most other creatures and includes numerous hard consonants and sibilants. |
|^!Ability Score Increase |^Your Strength score increases by 2, and your Charisma score increases by 1. |
|^![[Draconic Ancestry]] |^<$transclude tiddler="Draconic Ancestry" mode=block /> |
|^![[Breath Weapon]] |^{{Breath Weapon}} |
|^![[Damage Resistance|Dragonborn Damage Resistance]] |^{{Dragonborn Damage Resistance}} |

<<subraces Dragonborn>>
You have resistance to the damage type associated with your draconic ancestry.
''Prerequisite:'' 7th level

You can cast confusion once using a warlock spell slot. You can’t do so again until you finish a long rest.

This spell shapes a creature’s dreams. 
Choose a creature known to you as the target of this spell. The target must be on the same plane of existence as you. Creatures that don’t sleep, such as elves, can’t be contacted by this spell. You, or a willing creature you touch, enters a trance state, acting as a messenger. While in the trance, the messenger is aware of his or her surroundings, but can’t take actions or move. 

If the target is asleep, the messenger appears in the target’s dreams and can converse with the target as long as it remains asleep, through the duration of the spell. The messenger can also shape the environment of the dream, creating landscapes, objects, and other images. The messenger can emerge from the trance at any time, ending the effect of the spell early. The target recalls the dream perfectly upon waking. If the target is awake when you cast the spell, the messenger knows it, and can either end the trance (and the spell) or wait for the target to fall asleep, at which point the messenger appears in the target’s dreams. 

You can make the messenger appear monstrous and terrifying to the target. If you do, the messenger can deliver a message of no more than ten words and then the target must make a Wisdom saving throw. On a failed save, echoes of the phantasmal monstrosity spawn a nightmare that lasts the duration of the target’s sleep and prevents the target from gaining any benefit from that rest. In addition, when the target wakes up, it takes 3d6 psychic damage. 

If you have a body part, lock of hair, clipping from a nail, or similar portion of the target’s body, the target makes its saving throw with disadvantage.
''Multiattack.'' The dretch makes two attacks: one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +2>>|<<piercing 1d6>> |<<reach 5>> |
| !<<melee Claw +2>>|<<slashing 2d4>> |<<reach 5>> |
| !Fetid Cloud|''1/Day''<br/>A <<sphere 10>> of disgusting green gas extends out from the dretch. The gas spreads around corners, and its area is [[Lightly Obscured]]. It lasts for <<time 1m>> or until a strong wind disperses it. Any creature that starts its turn in that area must succeed on a <<save Con 11>> or be [[Poisoned]] until the start of it's next turn. While [[Poisoned]] in this way, the target can take either an <<action>> or <<ba>> on its turn, not both, and can't take <<reaction>>. |<|
"""
''Fey Ancestry.'' The drider has advantage on saving throws against being [[Charmed]], and magic can’t put the drider to sleep.
''Innate Spellcasting.'' The drider’s innate spellcasting ability is Wisdom, <<skillcheck "Spell DC" 13>>. The drider can innately cast the following spells, requiring no material components:
''At will:'' [[Dancing Lights]]
''1/day each:'' [[Darkness]], [[Faerie Fire]]
''Spider Climb.'' The drider can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Sunlight Sensitivity.'' While in sunlight, the drider has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
''Web Walker.'' The drider ignores movement restrictions caused by webbing.
"""
<<divider>>
''Multiattack.'' The drider makes three attacks, either with its longsword or its longbow. It can replace one of those attacks with a bite attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1d4>> + <<poison 2d8>>  |<<reach 5>> |
| !<<melee Longsword +6>>|<<slashing 1d8+3>><br/><<slashing 1d10+3  >> (''two-handed'') |<<reach 5>> |
| !<<ranged Longbow +6>>|<<piercing 1d8+3>>+<<poison 1d8>> |<<range 150/600>> |
"""
''Fey Ancestry.'' The drow has advantage on saving throws against being [[Charmed]], and magic can’t put the drow to sleep.
''Innate Spellcasting.'' The drow’s spellcasting ability is Charisma, <<skillcheck "Save DC" 11>>. It can innately cast the following spells, requiring no material components:
''At will:'' [[Dancing Lights]]
''1/day each:'' [[Darkness]], [[Faerie Fire]]
''Sunlight Sensitivity.'' While in sunlight, the drow has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged "Hand Crossbow" +4>>|<<piercing 1d6+2>> |<<range 30/120>> |
|~|Target must succeed on a <<save Con 13>> or be [[Poisoned]] for <<time 1h>>. If the saving throw fails by 5 or more, the target is also [[Unconscious]] while poisoned in this way. The target wakes up if it takes damage or if another creature takes an <<action>> to shake it awake. |<|
"""
''Price per Dose:'' 200 gp
"""

This poison is typically made only by the drow, and only in a place far removed from sunlight. 

* A creature subjected to this poison must succeed on a <<save Con 13>> or be [[Poisoned]] for <<time 1h>>. 
** If the saving throw fails by 5 or more, the creature is also [[Unconscious]] while [[Poisoned]] in this way. 
** The creature wakes up if it takes damage or if another creature takes an action to shake it awake.
As a druid, you gain the following class features.

!!! Hit Points
"""
''Hit Dice:'' 1d8 per druid level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per druid level after 1st
"""

!!! Proficiencies
"""
''Armor:'' Light armor, medium armor, shields (druids will not wear armor or use shields made of metal)
''Weapons:'' Clubs, daggers, darts, javelins, maces, quarterstaffs, scimitars, sickles, slings, spears
''Tools:'' Herbalism kit
''Saving Throws:'' Intelligence, Wisdom
''Skills:'' Choose two from Arcana, Animal Handling, Insight, Medicine, Nature, Perception, Religion, and Survival
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a wooden shield or (b) any simple weapon
(a) a scimitar or (b) any simple melee weapon
Leather armor, an explorer’s pack, and a druidic focus
"""

!!! Subclasses

<<list-box "[tag[Druid]tag[Subclass]sort[]]">>

!!! Advancement Table

{{||DruidAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Druidic]] [[Druid Spellcasting]] [[Wild Shape]] [[Wild Companion]] [[Druid Circle]] [[Wild Shape Improvement]] [[Druid Ability Score Improvement]] [[Druid Cantrip Versatility]] [[Timeless Body]] [[Beast Spells]] [[Archdruid]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Druid Ability Score Improvement}}
{{Druid Ability Score Improvement}}
{{Druid Ability Score Improvement}}
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can replace one cantrip you learned from this class’s Spellcasting feature with another cantrip from the druid spell list.
<<spelltable "[[Control Flames]] [[Create Bonfire]] [[Druidcraft]] [[Frostbite]] [[Guidance]] [[Gust]] [[Infestation]] [[Magic Stone]] [[Mending]] [[Mold Earth]] [[Poison Spray]] [[Primal Savagery]] [[Produce Flame]] [[Resistance]] [[Shape Water]] [[Shillelagh]] [[Thorn Whip]] [[Thunderclap]]">>
At 2nd level, you choose to identify with a circle of druids: the Circle of the Land detailed at the end of the class description or one from the Player's Handbook or other sources. Your choice grants you features at 2nd level and again at 6th, 10th, and 14th level.
Drawing on the divine essence of nature itself, you can cast spells to shape that essence to your will. See Spells Rules for the general rules of spellcasting and the Spells Listing for the druid spell list.

!!! Cantrips

At 1st level, you know two cantrips of your choice from the druid spell list. You learn additional druid cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Druid table.

!!! Preparing and Casting Spells

The Druid table shows how many spell slots you have to cast your druid spells of 1st level and higher. To cast one of these druid spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

You prepare the list of druid spells that are available for you to cast, choosing from the druid spell list. When you do so, ''choose a number of druid spells equal to your Wisdom modifier + your druid level (minimum of one spell)''. The spells must be of a level for which you have spell slots.

For example, if you are a 3rd-level druid, you have four 1st-level and two 2nd-level spell slots. With a Wisdom of 16, your list of prepared spells can include six spells of 1st or 2nd level, in any combination. If you prepare the 1st-level spell cure wounds, you can cast it using a 1st-level or 2nd-level slot. Casting the spell doesn’t remove it from your list of prepared spells.

You can also change your list of prepared spells when you finish a long rest. Preparing a new list of druid spells requires time spent in prayer and meditation: at least 1 minute per spell level for each spell on your list.

!!! Spellcasting Ability

Wisdom is your spellcasting ability for your druid spells, since your magic draws upon your devotion and attunement to nature. You use your Wisdom whenever a spell refers to your spellcasting ability. In addition, you use your Wisdom modifier when setting the saving throw DC for a druid spell you cast and when making an attack roll with one.

''Spell save DC ='' 8 + your proficiency bonus + your Wisdom modifier

''Spell attack modifier ='' your proficiency bonus + your Wisdom modifier

!!! Ritual Casting

You can cast a druid spell as a ritual if that spell has the ritual tag and you have the spell prepared.

!!! Spellcasting Focus

You can use a druidic focus (see the Adventuring Gear section) as a spellcasting focus for your druid spells.

<<htabs "[tag[Druid Spells]sort[order]]">>
"""
''Spellcasting.'' The druid is a 4th-level spellcaster. Its spellcasting ability is Wisdom (<<save "Spell DC" 12>>, <<casted "Spell Attack" +4>>). It has the following druid spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Druidcraft]], [[Produce Flame]], [[Shillelagh]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Entangle]], [[Longstrider]], [[Speak with Animals]], [[Thunderwave]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Animal Messenger]], [[Barkskin]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Quarterstaff +2>><br/><<melee "Quarterstaff with&nbsp;[[Shillelagh]]" +4>>|<<bludgeoning 1d6>><br/><<bludgeoning 1d8+2>> (''with [[Shillelagh]] or Two-handed'') |<<reach 5>> |
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt1wi4AsGd8fAsPmMPpPXq7T7Df+y5564/e6m6yX4vl+9F3jwR1goJjhnqGiIOLb4yNiIBUlZKFlVmRl56aTpacmp9DlKGIpEupmwaDqE+sYByurjekjyJ9vjCmOHqzOak9droxkEKCyTeVR77ELJ/GwACQ39OE2taH2dmt2Lzc3s/X28LS4bW95dii58vm5+657uF88OT8+qfm+arx9q3+9vHsCAfQbuK2iQ07+EiAQylOTwoaCIEgNRrKgHIUb+ixo3ZuzoMRGekBzvkPxo8iQdkCodjWzJhiXMLS9nkqlpswvOnDRT8uSy8+ckn0KzBC2KiShSK0eXSmnqFArUqJ2UUo0i82qTrFqXcO2a5CvYU1PHGhFr1gvatMXWsi1T9m3buHJnua3L4yJeIQv38r3r90bfwD8GE86r9zBiwIpj8Gu8mDHkZoYn12hnWTDmzDTIcZ7h+bPj0KIpby5t+jHqF+FW72rtugWx2CmS0Vbh7DZuabp3w+5tYhXwNqqHo6hsPDjd5CKWozZTOw7zAGmOw2H+6sT15NtLdB/+3VYw8NKVVzfOyzwa7unFr0fv3MJ44JInzO+deEN5/CD+l8lvf5s90F0QX2P5GGNffYFZ8l6CCvo1Gx/5fRZhBMhxViEEF8ICwFIZPrBhBgjm5ImDBZoYhlAlWjihBtmR+CEDIf53H0wratgigfuRhAqKANaxY0g9SvhgAz9upAuRJ4JoVUVJslikAlGK8ySOUyJwJTdVMpmjkkc6SYoqDhTHpSpZZpPkgFLOOEiK0bCpDy0jvtllmwOS+ZCcamJZp528Camnf3TGFyOYgS4AZ6GGyolon9TZdlKgHa4JmKKLDkkpoZCqxGijd91oY5gy9glqqJ8Y6egvM52KKqmitmTpo66+ymklssphpqa01soqn7qqCuuuiWLK45Zw3lr+KpJbIvulnb72CiixgzY5bYfLXgrss81Kimux0vq5Lbe8ZpsrtdxOGumu2gYJLi2rJltuuHrCaCuX1DKrbrB/tnrvvE5Vw2+z+MIbFXITfquVwWKR2xWeA9eYaW5pOazXIZuypXBQ+ZqF50UbT8yVxwiD3FTF15LMbrXsuguhvBqz3DLEKoc388V7yfzweRFDS1iDO9Pcbqx1WStozTp7SrBiRefsM9L1itZtvClL/RvUTk+97mlQR81001nzwjV/6HY9Z9AvTuer0UdTDfR0Vau9Ntpkx21222537Ch9iR2rd1ZnPmfyvXJ/fXbdZQ/+c9tYI8524YaPzfiYe9OUHfmoMonhZuVefhm25j6u3LnnUO60tOhW4lS66fYSFbrqp6eUuuuSFxS77JY7bHvAf0dOWu66L2n7277fjvvwhAtu/PECJ//48szPbffz+z7f+O5yT099884nj3320DvufffhC+d94sDL3nv539deft7UW2868upXD/n8o9uPf/76789///7/D8AACnCABCygAXVTAAA7
|max top|k
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !Spells Prepared | !Spell Slots per Spell Level |<|<|<|<|<|<|<|<|
|~|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 |<<list-abilities 1>> | 2 | 1+Wis_mod | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 |<<list-abilities 2>> | 2 | 2+Wis_mod | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 |<<list-abilities 3>> | 2 | 3+Wis_mod | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 |<<list-abilities 4>> | 3 | 4+Wis_mod | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 |<<list-abilities 5>> | 3 | 5+Wis_mod | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 |<<list-abilities 6>> | 3 | 6+Wis_mod | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 |<<list-abilities 7>> | 3 | 7+Wis_mod | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 |<<list-abilities 8>> | 3 | 8+Wis_mod | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 |<<list-abilities 9>> | 3 | 9+Wis_mod | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 |<<list-abilities 10>> | 4 | 10+Wis_mod | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 |<<list-abilities 11>> | 4 | 11+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 |<<list-abilities 12>> | 4 | 12+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 |<<list-abilities 13>> | 4 | 13+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 |<<list-abilities 14>> | 4 | 14+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 |<<list-abilities 15>> | 4 | 15+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 |<<list-abilities 16>> | 4 | 16+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 |<<list-abilities 17>> | 4 | 17+Wis_mod | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 |<<list-abilities 18>> | 4 | 18+Wis_mod | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 |<<list-abilities 19>> | 4 | 19+Wis_mod | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 |<<list-abilities 20>> | 4 | 20+Wis_mod | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
Whispering to the spirits of nature, you create one of the following effects within range: 

* You create a tiny, harmless sensory effect that predicts what the weather will be at your location for the next 24 hours. The effect might manifest as a golden orb &nbsp;for clear skies, a cloud for rain, falling snowflakes for snow, and so on. This effect persists for 1 round. 
* You instantly make a flower blossom, a seed pod open, or a leaf bud bloom. 
* You create an instantaneous, harmless sensory effect, such as falling leaves, a puff of wind, the sound of a small animal, or the faint odor of skunk. The effect &nbsp;must fit in a 5-foot cube. 
* You instantly light or snuff out a candle, a torch, or a small campfire.
You know Druidic, the secret language of druids. You can speak the language and use it to leave hidden messages. You and others who know this language automatically spot such a message. Others spot the message’s presence with a successful DC 15 Wisdom (Perception) check but can’t decipher it without magic.
"""
''Innate Spellcasting.'' The dryad's innate spellcasting ability is Charisma (spell save DC 14). The dryad can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Druidcraft]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Entangle]], [[Goodberry]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Barkskin]], [[Pass Without Trace]], [[Shillelagh]]
''Magic Resistance.'' The dryad has advantage on saving throws against spells and other magical effects.
''Speak with Beasts and Plants.'' The dryad can communicate with beasts and plants as if they shared a language.
''Tree Stride.'' Once on her turn, the dryad can use 10 feet of her movement to step magically into one living tree within her reach and emerge from a second living tree within 60 feet of the first tree, appearing in an unoccupied space within 5 feet of the second tree. Both trees must be large or bigger.
"""
<<divider>>

|max|k
| !<<action>> Actions |<|<|
| !<<melee Club +2>>|<<bludgeoning 1d4>> |<<reach 5>> |
| !<<melee Shillelagh +6>>|<<bludgeoning 1d8+4>> |<<reach 5>> |
|^ !Fey Charm|The dryad targets one humanoid or beast that she can see within 30 feet of her. If the target can see the dryad, it must succeed on a <<save Wis 14>> or be magically [[Charmed]]. The [[Charmed]] creature regards the dryad as a trusted friend to be heeded and protected. Although the target isn't under the dryad's control, it takes the dryad's requests or actions in the most favorable way it can.<br/>&nbsp;<br/>Each time the dryad or its allies do anything harmful to the target, it can repeat the saving throw, ending the effect on itself on a success. Otherwise, the effect lasts 24 hours or until the dryad dies, is on a different plane of existence from the target, or ends the effect as a bonus action. If a target's saving throw is successful, the target is immune to the dryad's Fey Charm for the next 24 hours.<br/>&nbsp;<br/>The dryad can have no more than one humanoid and up to three beasts charmed at a time. |<|
When you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon.
"""
''Duergar Resilience.'' The duergar has advantage on saving throws against poison, spells, and illusions, as well as to resist being charmed or paralyzed.
''Sunlight Sensitivity.'' While in sunlight, the duergar has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !Enlarge|''Recharges after a Short or Long Rest''<br/>For <<time 1m>>, the duergar magically increases in size, along with anything it is wearing or carrying. While enlarged, the duergar is Large, doubles its damage dice on Strength-based weapon attacks (included in the attacks), and makes Strength checks and Strength saving throws with advantage. If the duergar lacks the room to become Large, it attains the maximum size possible in the space available. |<|
| !<<melee "War Pick" +4>>|<<piercing 1d8+2>><br/><<piercing 2d8+2>> (''enlarged'') |<<reach 5>> |
| !<<ranged Javelin +4>>|<<piercing 1d6+2>><br/><<piercing 2d6+2>> (''enlarged'') |<<reach 5>><br/><<range 30/120>> |
| !Invisibility|''Recharges after a Short or Long Rest''<br/>The duergar magically turns invisible until it attacks, casts a spell, or uses its Enlarge, or until its concentration is broken, up to <<time 1h>> (as if concentrating on a spell). Any equipment the duergar wears or carries is invisible with it. |<|
<<vtabs "[tag[Dungeon Master]sort[order]]">>
"""
''Price:'' 12 gp
1 Backpack
1 Crowbar
1 Hammer
10 Pitons
10 Torches
1 Tinderbox
10 days of Rations
1 Waterskin
50 feet of Hempen Rope
"""
"""
''Death Burst.'' When the mephit dies, it explodes in a burst of dust. Each creature within <<sphere 5>> of it must then succeed on a <<save Con 10>> or be [[Blinded]] for <<time 1m>>. A [[Blinded]] creature can repeat the saving throw on each of its turns, ending the effect on itself on a success.
''Innate Spellcasting (1/Day).'' The mephit can innately cast [[Sleep]], requiring no material components. Its innate spellcasting ability is Charisma.
"""

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +4>>|<<slashing 1d4+2>> |<<reach 5>> |
| !Blinding Breath|''Recharge 6.''<br/>The mephit exhales a <<cone 15>> of blinding dust. Each creature in that area must succeed on <<save Dex 10>> or be [[Blinded]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
Found in a small packet, this powder resembles very fine sand. There is enough of it for one use. When you use an action to throw the dust into the air, you and each creature and object within 10 feet of you become invisible for <<time "2d4 minutes">>. The duration is the same for all subjects, and the dust is consumed when its magic takes effect. If a creature affected by the dust attacks or casts a spell, the invisibility ends for that creature.
This small packet contains <<roll 1d6+4>> pinches of dust. You can use an action to sprinkle a pinch of it over water. The dust turns a cube of water 15 feet on a side into one marble-sized pellet, which floats or rests near where the dust was sprinkled. The pellet’s weight is negligible.

Someone can use an action to smash the pellet against a hard surface, causing the pellet to shatter and release the water the dust absorbed. Doing so ends that pellet’s magic.

An elemental composed mostly of water that is exposed to a pinch of the dust must make a <<save Con 13>> <fail><<necrotic 10d6>></fail> <pass><<halved>></pass>.
Found in a small container, this powder resembles very fine sand. It appears to be [[Dust of Disappearance]], and an [[Identify]] spell reveals it to be such. There is enough of it for one use.

When you use an action to throw a handful of the dust into the air, you and each creature that needs to breathe within 30 feet of you must succeed on a <<save Con 15>> or become unable to breathe, while sneezing uncontrollably. A creature affected in this way is [[Incapacitated]] and [[Suffocating]]. As long as it is conscious, a creature can repeat the saving throw at the end of each of its turns, ending the effect on it on a success. The [[Lesser Restoration]] spell can also end the effect on a creature.
!! Dwarf Traits

Your dwarf character has an assortment of inborn abilities, part and parcel of dwarven nature.

|^!Age |^Dwarves mature at the same rate as humans, but they’re considered young until they reach the age of 50. On average, they live about 350 years. |
|^!Alignment |^Most dwarves are lawful, believing firmly in the benefits of a well-ordered society. They tend toward good as well, with a strong sense of fair play and a belief that everyone deserves to share in the benefits of a just order. |
|^!Size |^Dwarves stand between 4 and 5 feet tall and average about 150 pounds. Your size is Medium. |
|^!Speed |^Your base walking speed is 25 feet. Your speed is not reduced by wearing heavy armor. |
|^!Darkvision |^Accustomed to life underground, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common and Dwarvish. Dwarvish is full of hard consonants and guttural sounds, and those characteristics spill over into whatever other language a dwarf might speak. |
|^!Ability Score Increase |^Your Constitution score increases by 2. |
|^![[Dwarven Resilience]] |^{{Dwarven Resilience}} |
|^![[Dwarven Combat Training]] |^{{Dwarven Combat Training}} |
|^![[Tool Proficiency|Dwarven Tool Proficiency]] |^{{Dwarven Tool Proficiency}} |
|^![[Stonecunning]] |^{{Stonecunning}} |

<<subraces Dwarf>>
You have proficiency with the battleaxe, handaxe, light hammer, and warhammer.
While wearing this armor, you gain a +2 bonus to AC. In addition, if an effect moves you against your will along the ground, you can use your reaction to reduce the distance you are moved by up to 10 feet.
You have advantage on saving throws against poison, and you have resistance against poison damage.
You gain a +3 bonus to attack and damage rolls made with this magic weapon. It has the thrown property with <<range 20/60>>. When you hit with a ranged attack using this weapon, it deals an extra <<damage 1d8>> or, if the target is a giant, <<damage 2d8>>. Immediately after the attack, the weapon flies back to your hand.
You gain proficiency with the artisan’s tools of your choice: smith’s tools, brewer’s supplies, or mason’s tools.
Your hit point maximum increases by 1, and it increases by 1 every time you gain a level.
"""
''Keen Sight.'' The eagle has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Talons +4>>|<<slashing 1d4+2>> |<<reach 5>> |
"""
''Earth Glide.'' The elemental can burrow through non magical, unworked earth and stone. While doing so, the elemental doesn't disturb the material it moves through.
''Siege Monster.'' The elemental deals double damage to objects and structures.
"""
<<divider>>
''Multiattack.'' The elemental makes two slam attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Slam +8>>|<<bludgeoning 2d8+5>> |<<reach 10>> |
You create a seismic disturbance at a point on the ground that you can see within range. 
For the duration, an intense tremor rips through the ground in a 100-foot- radius circle centered on that point and shakes creatures and structures in contact with the ground in that area. 

The ground in the area becomes difficult terrain. Each creature on the ground that is concentrating must make a Constitution saving throw. On a failed save, the creature’s concentration is broken. 

When you cast this spell and at the end of each turn you spend concentrating on it, each creature on the ground in the area must make a Dexterity saving throw. On a failed save, the creature is knocked prone. 

This spell can have additional effects depending on the terrain in the area, as determined by the DM. 

''Fissures.'' Fissures open throughout the spell’s area at the start of your next turn after you cast the spell. A total of 1d6 such fissures open in locations chosen by the DM. Each is 1d10 x 10 feet deep, 10 feet wide, and extends from one edge of the spell’s area to the opposite side. A creature standing on a spot where a fissure opens must succeed on a Dexterity saving throw or fall in. A creature that successfully saves moves with the fissure’s edge as it opens. 
A fissure that opens beneath a structure causes it to automatically collapse (see below). 

''Structures.'' The tremor deals 50 bludgeoning damage to any structure in contact with the ground in the area when you cast the spell and at the start of each of your turns until the spell ends. If a structure drops to 0 hit points, it collapses and potentially damages nearby creatures. A creature within half the distance of a structure’s height must make a Dexterity saving throw. On a failed save, the creature takes 5d6 bludgeoning damage, is knocked prone, and is buried in the rubble, requiring a DC 20 Strength (Athletics) check as an action to escape. The DM can adjust the DC higher or lower, depending on the nature of the rubble. On a successful save, the creature takes half as much damage and doesn’t fall prone or become buried.
Each of the quiver's three compartments connects to an extradimensional space that allows the quiver to hold numerous items while never weighing more than 2 pounds. The shortest compartment can hold up to sixty arrows, bolts, or similar objects. The midsize compartment holds up to eighteen javelins or similar objects. The longest compartment holds up to six long objects, such as bows, quarterstaffs, or spears.

You can draw any item the quiver contains as if doing so from a regular quiver or scabbard.
"""
''Elemental Demise.'' If the efreeti dies, its body disintegrates in a flash of fire and puff of smoke, leaving behind only equipment the efreeti was wearing or carrying.
''Innate Spellcasting.'' The efreeti’s innate spellcasting ability is Charisma, <<skillcheck "Spell DC" 15>>, <<casted "Spell To-Hit" +7>>. It can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Magic]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Enlarge/Reduce]], [[Tongues]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Conjure Elemental]] (<<mob "Fire Elemental">> only), [[Gaseous Form]], [[Invisibility]], [[Major Image]], [[Plane Shift]], [[Wall of Fire]]
"""
<<divider>>
''Multiattack.'' The efreeti makes two scimitar attacks or uses its Hurl Flame twice.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +10>>|<<slashing 2d6+6>>+<<fire 2d6>> |<<reach 5>> |
| !<<ranged "Hurl Flame" +7>>|<<fire 5d6>> |<<range 120>> |
This painted brass bottle weighs 1 pound. When you use an action to remove the stopper, a cloud of thick smoke flows out of the bottle. At the end of your turn, the smoke disappears with a flash of harmless fire, and an efreeti appears in an unoccupied space within 30 feet of you. See the Monster Manual for the efreeti’s statistics.

The first time the bottle is opened, the DM rolls to determine what happens.

|max top|k
| !d100 | !Effect |
|^ !01-10 |^The efreeti attacks you. After fighting for 5 rounds, the efreeti disappears, and the bottle loses its magic. |
|^ !11-90 |^The efreeti serves you for <<time 1h>>, doing as you command. Then the efreeti returns to the bottle, and a new stopper contains it. The stopper can't be removed for <<time 24h>>. The next two times the bottle is opened , the same effect occurs. If the bottle is opened a fourth time, the efreeti escapes and disappears, and the bottle loses its magic. |
|^ !91-00 |^The efreeti can cast the [[Wish]] spell three times for you. It disappears when it grants the final wish or after 1 hour, and the bottle loses its magic. |
A beam of crackling energy streaks toward a creature within range. Make a ranged spell attack against the target. On a hit, the target takes 1d10 force damage.&nbsp;
In your study of occult lore, you have unearthed eldritch invocations, fragments of forbidden knowledge that imbue you with an abiding magical ability. A level prerequisite refers to your level in this class.

At 2nd level, you gain two eldritch invocations of your choice. Your invocation options are detailed at the end of the class description. When you gain certain warlock levels, you gain additional invocations of your choice, as shown in the Invocations Known column of the Warlock table.

Additionally, when you gain a level in this class, you can choose one of the invocations you know and replace it with another invocation that you could learn at that level.

If an eldritch invocation has prerequisites, you must meet them to learn it. You can learn the invocation at the same time that you meet its prerequisites. A level prerequisite refers to your level in this class.

!! No Prerequisites

<<sections-vertical "[[Armor of Shadows]] [[Beast Speech]] [[Beguiling Influence]] [[Devil’s Sight]] [[Eldritch Mind]] [[Eldritch Sight]] [[Eyes of the Rune Keeper]] [[Fiendish Vigor]] [[Gaze of Two Minds]] [[Mask of Many Faces]] [[Misty Visions]] [[Thief of Five Fates]]">>

!! Prerequisite: Eldritch Blast Cantrip

<<sections-vertical "[[Agonizing Blast]] [[Eldritch Spear]] [[Grasp of Hadar]] [[Lance of Lethargy]] [[Repelling Blast]]">>

!! Prerequisite: Hex Spell or a Warlock feature that curses

<<sections-vertical "[[Maddening Hex]] [[Relentless Hex]]">>

!! Prerequisite: Pact of the Blade

<<sections-vertical "[[Improved Pact Weapon]] [[Eldritch Smite]] [[Thirsting Blade]] [[Lifedrinker]]">>

!! Prerequisite: Pact of the Chain

<<sections-vertical "[[Gift of the Ever-Living Ones]] [[Investment of the Chain Master]] [[Voice of the Chain Master]] [[Chains of Carceri]]">>

!! Prerequisite: Pact of the Tome

<<sections-vertical "[[Aspect of the Moon]] [[Book of Ancient Secrets]] [[Gift of the Protectors]]">>

!! Prerequisite: Pact of the Talisman

<<sections-vertical "[[Rebuke of the Talisman]] [[Bond of the Talisman]] [[Far Scribe]] [[Protection of the Talisman]]">>

!! Prerequisite: 5th Level

<<sections-vertical "[[Cloak of Flies]] [[Gift of the Depths]] [[Mire the Mind]] [[One with Shadows]] [[Sign of Ill Omen]] [[Tomb of Levistus]] [[Undying Servitude]]">>

!! Prerequisite: 7th Level

<<sections-vertical "[[Bewitching Whispers]] [[Dreadful Word]] [[Ghostly Gaze]] [[Sculptor of Flesh]] [[Trickster's Escape]]">>

!! Prerequisite: 9th Level

<<sections-vertical "[[Ascendant Step]] [[Minions of Chaos]] [[Otherworldly Leap]] [[Whispers of the Grave]]">>

!! Prerequisite: 15th Level

<<sections-vertical "[[Master of Myriad Forms]] [[Shroud of Shadow]] [[Visions of Distant Realms]] [[Witch Sight]]">>

At 20th level, you can draw on your inner reserve of mystical power while entreating your patron to regain expended spell slots. You can spend 1 minute entreating your patron for aid to regain all your expended spell slots from your Pact Magic feature. Once you regain spell slots with this feature, you must finish a long rest before you can do so again.
You have advantage on Constitution saving throws that you make to maintain your concentration on a spell.
You can cast detect magic at will, without expending a spell slot.
''Prerequisite:'' 5th level, Pact of the Blade feature

Once per turn when you hit a creature with your pact weapon, you can expend a warlock spell slot to deal an extra 1d8 force damage to the target, plus another 1d8 per level of the spell slot, and you can knock the target prone if it is Huge or smaller.

''Prerequisite:'' Eldritch Blast Cantrip

When you cast eldritch blast, its range is 300 feet.

"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can do one of the following, representing a change of focus in your occult studies:

* Replace one cantrip you learned from this class’s Pact Magic feature with another cantrip from the warlock spell list.
* Replace the option you chose for the Pact Boon feature with one of that feature’s other options.
* If you’re 12th level or higher, replace one spell from your Mystic Arcanum feature with another warlock spell of the same level.

If this change makes you ineligible for any of your Eldritch Invocations, you must also replace them now, choosing invocations for which you qualify.
Elementals are creatures native to the elemental planes . Some creatures of this type are little more than animate masses of their respective elements, including the creatures simply called elementals. Others have biological forms infused with elemental energy. The races of genies, including djinn and efreet, form the most important civilizations on the elemental planes. Other elemental creatures include azers, invisible stalkers, and water weirds.

<<list-box "[tag[Elemental]sort[]]" "No elementals found.">>
Starting at 6th level, when you cast a spell that deals damage of the type associated with your draconic ancestry, you can add your Charisma modifier to one damage roll of that spell. At the same time, you can spend 1 sorcery point to gain resistance to that damage type for 1 hour.
This gem contains a mote of elemental energy. When you use an action to break the gem, an elemental is summoned as if you had cast the [[Conjure Elemental]] spell, and the gem’s magic is lost. The type of gem determines the elemental summoned by the spell.

| !Gem | !Summoned Elemental |
|![[Elemental Gem, Blue Sapphire]] |<<mob "Air Elemental">> |
|![[Elemental Gem, Yellow Diamond]] |<<mob "Earth Elemental">> |
|![[Elemental Gem, Red Corundum]] |<<mob "Fire Elemental">> |
|![[Elemental Gem, Emerald]] |<<mob "Water Elemental">> |
This gem contains a mote of elemental energy. When you use an action to break the gem, an <<mob "Air Elemental">> is summoned as if you had cast the [[Conjure Elemental]] spell, and the gem's magic is lost. 
This gem contains a mote of elemental energy. When you use an action to break the gem, an <<mob "Water Elemental">> is summoned as if you had cast the [[Conjure Elemental]] spell, and the gem's magic is lost. 
This gem contains a mote of elemental energy. When you use an action to break the gem, an <<mob "Fire Elemental">> is summoned as if you had cast the [[Conjure Elemental]] spell, and the gem's magic is lost. 
This gem contains a mote of elemental energy. When you use an action to break the gem, an <<mob "Earth Elemental">> is summoned as if you had cast the [[Conjure Elemental]] spell, and the gem's magic is lost. 
"""
''Trampling Charge.'' If the elephant moves at least 20 feet straight toward a creature and then hits it with a gore attack on the same turn, that target must succeed on a <<save Str 12>> or be knocked [[Prone]]. If the target is prone, the elephant can make one stomp attack against it as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Gore +8>>|<<piercing 3d8+6>> |<<reach 5>> |
| !<<melee Stomp +8>>|<<bludgeoning 3d10+6>> |<<reach 5>><br/>[[Prone]] creature |
!!

Your elf character has a variety of natural abilities, the result of thousands of years of elven refinement.

|^!Age |^Although elves reach physical maturity at about the same age as humans, the elven understanding of adulthood goes beyond physical growth to encompass worldly experience. An elf typically claims adulthood and an adult name around the age of 100 and can live to be 750 years old. |
|^!Alignment |^Elves love freedom, variety, and self-expression, so they lean strongly toward the gentler aspects of chaos. They value and protect others’ freedom as well as their own, and they are more often good than not. The drow are an exception; their exile into the Underdark has made them vicious and dangerous. Drow are more often evil than not. |
|^!Size |^Elves range from under 5 to over 6 feet tall and have slender builds. Your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Darkvision |^Accustomed to twilit forests and the night sky, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common and Elvish. Elvish is fluid, with subtle intonations and intricate grammar. Elven literature is rich and varied, and their songs and poems are famous among other races. Many bards learn their language so they can add Elvish ballads to their repertoires. |
|^!Ability Score Increase |^Your Dexterity score increases by 2. |
|^![[Keen Senses]] |^{{Keen Senses}} |
|^![[Fey Ancestry]] |^{{Fey Ancestry}} |
|^![[Trance]] |^{{Trance}} |

<<subraces Elf>>
You have proficiency with the longsword, shortsword, shortbow, and longbow.
"""
''Charge.'' If the elk moves at least 20 feet straight toward a target and then hits it with a ram attack on the same turn, the target takes an extra <<damage 2d6>>. If the target is a creature, it must succeed on a <<save Str 13>> or be knocked [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +5>>|<<bludgeoning 1d6+3>> |<<reach 5>> |
| !<<melee Hooves +5>>|<<bludgeoning 2d4+3>> |<<reach 5>><br/>[[Prone]] creature |
Beginning at 18th level, you are so evasive that attackers rarely gain the upper hand against you. No attack roll has advantage against you while you aren’t [[Incapacitated]].
You gain a +1 bonus to AC while you wear this armor. You are considered proficient with this armor even if you lack proficiency with medium armor.
Beginning at 10th level, you can add your Intelligence modifier to one damage roll of any wizard evocation spell you cast.
When you roll damage for a spell, you can spend 1 sorcery point to reroll a number of the damage dice up to your Charisma modifier (minimum of one). You must use the new rolls.

You can use Empowered Spell even if you have already used a different Metamagic option during the casting of the spell.
Beginning at 18th level, you can use your action to spend 4 [[Ki]] points to become invisible for 1 minute. During that time, you also have resistance to all damage but force damage.

Additionally, you can spend 8 [[Ki]] points to cast the astral projection spell, without needing material components. When you do so, you can’t take any other creatures with you.


You touch a creature and bestow upon it a magical enhancement. Choose one of the following effects: the target gains the effect until the spell ends.

* ''Bear’s Endurance.'' The target has <<advantage>> on Constitution checks. It also gains <<temp-hp 2d6>>, which are lost when the spell ends.
* ''Bull’s Strength.'' The target has <<advantage>> on Strength checks, and his or her carrying capacity doubles.
* ''Cat’s Grace.'' The target has <<advantage>> on Dexterity checks. It also doesn’t take damage from falling 20 feet or less if it isn’t incapacitated.
* ''Eagle’s Splendor.'' The target has <<advantage>> on Charisma checks.
* ''Fox’s Cunning.'' The target has <<advantage>> on Intelligence checks.
* ''Owl’s Wisdom.'' The target has <<advantage>> on Wisdom checks. 
You cause a creature or an object you can see within range to grow larger or smaller for the duration. Choose either a creature or an object that is neither worn nor carried. If the target is unwilling, it can make a Constitution saving throw. On a success, the spell has no effect. 

If the target is a creature, everything it is wearing and carrying changes size with it. Any item dropped by an affected creature returns to normal size at once. 

<b>Enlarge</b>&nbsp;
The target’s size doubles in all dimensions, and its weight is multiplied by eight. This growth increases its size by one category – from Medium to Large, for example. If there isn’t enough room for the target to double its size, the creature or object attains the maximum possible size in the space available. Until the spell ends, the target also has advantage on Strength checks and Strength saving throws. The target’s weapons also grow to match its new size. While these weapons are enlarged, the target’s attack with them deal 1d4 extra damage. 

<b>Reduce</b>&nbsp;
The target’s size is halved in all dimensions, and its weight is reduced to one-eighth of normal. This reduction decreases its size by one category – from Medium to Small, for example. Until the spell ends, the target also has disadvantage on Strength checks and Strength saving throws. The target’s weapons also shrink to match its new size. While these weapons are reduced, the target’s attacks with them deal 1d4 less damage (this can’t reduce the damage below 1).
Grasping weeds and vines sprout from the ground in a 20-foot square starting from a point within range. For the duration, these plants turn the ground in the area into difficult terrain. 

A creature in the area when you cast the spell must succeed on a Strength saving throw or be [[Restrained]] by the entangling plants until the spell ends. A creature [[Restrained]] by the plants can use its action to make a Strength check against your spell save DC. On a success, it frees itself. 

When the spell ends, the conjured plants wilt away.
"""
''Price:'' 40 gp
1 Backpack
1 Bedroll
2 Costumes
5 Candles
5 Days of Rations
1 Waterskin
1 Disguise Kit
"""
You weave a distracting string of words, causing creatures of your choice that you can see within range and that can hear you to make a Wisdom saving throw. Any creature that can't be [[Charmed]] succeeds on this saving throw automatically, and if you or your companions are fighting a creature, it has advantage on the save. On a failed save, the target has disadvantage on Wisdom (Perception) checks made to perceive any creature other than you until the spell ends or until the target can no longer hear you. The spell ends if you are incapacitated or can no longer speak.
<<htabs "[tag[Entity]sort[]]">>
By its nature, adventuring involves delving into places that are dark, dangerous, and full of mysteries to be explored. The rules in this section cover some of the most important ways in which adventurers interact with the environment in such places. The Dungeon Master's Guide has rules covering more unusual situations.

<<vtabs "[tag[Rule]tag[Environment]nsort[order]]">>
<<sections "[tag[Equipment]nsort[order]]">>
<<vtabs "[tag[Equipment Pack]sort[]]">>
"""
''Hellish Weapons.'' The erinyes’s weapon attacks are magical and deal an extra 13 (3d8) poison damage on a hit (included in the attacks).
''Magic Resistance.'' The erinyes has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The erinyes makes three attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +8>>|<<slashing 1d8+4>>+<<poison 3d8>><br/><<slashing 1d10+4>>+<<poison 3d8>> (''two-handed'') |<<reach 5>> |
| !<<ranged Longbow +7>>|<<piercing 1d8+3>>+<<poison 3d8>> |<<range 150/600>> |
|~|Target must succeed on a <<save Con 14>> or be [[Poisoned]]. The poison lasts until it is removed by the [[Lesser Restoration]] spell or similar magic. |<|
| !<<reaction>> Reactions |<|<|
| !Parry|The erinyes adds <<ac +4>> against one melee attack that would hit it. To do so, the erinyes must see the attacker and be wielding a melee weapon. |<|
Opportunity attacks against you are made with disadvantage.
"""
''Price per Dose:'' 300 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 15>> or become [[Poisoned]] for <<time 8h>>. 
** The poisoned creature is [[Unconscious]]. 
** The creature wakes up if it takes damage or if another creature takes an action to shake it awake.
You step into the border regions of the Ethereal Plane, in the area where it overlaps with your current plane. You remain in the Border Ethereal for the duration or until you use your action to dismiss the spell. During this time, you can move in any direction. If you move up or down, every foot of movement costs an extra foot. You can see and hear the plan you originated from, but everything there looks gray, and you can’t see anything more than 60 feet away. 

While on the Ethereal Plane, you can only affect and be affected by other creatures on that plane. Creatures that aren’t on the Ethereal Plance can’t perceive you and can’t interact with you, unless a special ability or magic has given them the ability to do so. 

You ignore all objects and effects that aren’t on the Ethereal Plane, allowing you to move through objects you perceive on the plan you originated from. When the spell ends, you immediately return to the plane you originiated from in teh spot you currently occupy. If you occupy the same spot as a solid object or creature when this happens, you are imediately shunted to the neares unoccupied space that you can occupy and take force damage equal to twice the number of feet you are moved. 

This spell has no effect if you cast it while you are on the Ethereal Plane or a plane that doesn’t border it, such as one of the Outer Planes.&nbsp;
"""
''Spider Climb.'' The ettercap can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Web Sense.'' While in contact with a web, the ettercap knows the exact location of any other creature in contact with the same web.
''Web Walker.'' The ettercap ignores movement restrictions caused by webbing.
"""
<<divider>>
''Multiattack.'' The ettercap makes two attacks: one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d8+2>> + <<poison 1d8>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 11>> or be [[Poisoned]] for <<time 1m>>. The creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
| !<<melee Claws +4>>|<<slashing 2d4+2>> |<<reach 5>> |
| !<<ranged Web +4>>|&mdash; |<<range 30/60>> |
|~|''Recharge on 5-6''<br/>On hit, the creature is [[Restrained]] by webbing. As an <<action>>, the restrained creature can make a <<save Str 11>>, escaping from the webbing on a success. The effect ends if the webbing is destroyed. The webbing has <<ac 10>>, <<hp 5>>, is ''vulnerable'' to <<fire>> and ''immune'' to <<bludgeoning>>, <<poison>> and <<psychic>> |<|
"""
''Two Heads.'' The ettin has advantage on Wisdom (Perception) checks and on saving throws against being [[Blinded]], [[Charmed]], [[Deafened]], [[Frightened]], [[Stunned]], and knocked [[Unconscious]].
''Wakeful.'' When one of the ettin’s heads is asleep, its other head is awake.
"""
<<divider>>
''Multiattack.'' The ettin makes two attacks: one with its battleaxe and one with its morningstar.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Battleaxe +7>>|<<slashing 2d8+5>> |<<reach 5>> |
| !<<melee Morningstar +7>>|<<piercing 2d8+5>> |<<reach 5>> |
Smoke leaks from the lead-stoppered mouth of this brass bottle, which weighs 1 pound. When you use an action to remove the stopper, a cloud of thick smoke pours out in a <<sphere 60>> from the bottle. The cloud’s area is [[Heavily Obscured]]. Each minute the bottle remains open and within the cloud, the radius increases by 10 feet until it reaches its maximum radius of 120 feet.

The cloud persists as long as the bottle is open. Closing the bottle requires you to speak its command word as an action. Once the bottle is closed, the cloud disperses after <<time 10m>>. A moderate wind (11 to 20 miles per hour) can also disperse the smoke after <<time 1m>>, and a strong wind (21 or more miles per hour) can do so after 1 round.
Beginning when you select this school at 2nd level, the gold and time you must spend to copy an evocation spell into your spellbook is halved.
Some special abilities and environmental hazards, such as starvation and the long-term effects of freezing or scorching temperatures, can lead to a special condition called exhaustion. Exhaustion is measured in six levels. An effect can give a creature one or more levels of exhaustion, as specified in the effect's description.

| !Level | !Effect |
| !1 |Disadvantage on ability checks |
| !2 |Speed halved |
| !3 |Disadvantage on attack rolls and saving throws |
| !4 |Hit point maximum halved |
| !5 |Speed reduced to 0 |
| !6 |Death |

If an already exhausted creature suffers another effect that causes exhaustion, its current level of exhaustion increases by the amount specified in the effect's description.

A creature suffers the effect of its current level of exhaustion as well as all lower levels. For example, a creature suffering level 2 exhaustion has its speed halved and has disadvantage on ability checks.

An effect that removes exhaustion reduces its level as specified in the effect's description, with all exhaustion effects ending if a creature's exhaustion level is reduced below 1.

Finishing a long rest reduces a creature's exhaustion level by 1, provided that the creature has also ingested some food and drink. Also, being raised from the dead reduces a creature’s exhaustion level by 1.
This spell allows you to move at an incredible pace. When you cast this spell, and then as a bonus action on each of your turns until the spell ends, you can take the Dash action.
<<vtabs "[tag[Exploration]]">>
"""
''Price:'' 10 gp
1 Backpack
1 Bedroll
1 Mess Kit
1 Tinderbox
10 Torches
10 Days of Rations
1 Waterskin
50 Feet of Hempen Rope
"""
When you cast a spell that has a duration of 1 minute or longer, you can spend 1 sorcery point to double its duration, to a maximum duration of 24 hours.
<div class="gallery">
<$list filter="[all[tiddlers]tag[Image]has[_canonical_uri]sort[]]"><$link to=<<currentTiddler>> tooltip=<<currentTiddler>> class="icon" ><$image source=<<currentTiddler>> /></$link></$list>
</div>
For the spell’s duration, your eyes become an inky void imbued with dread power. One creature of your choice within 60 feet of you that you can see must succeed on a Wisdom saving throw or be affected by one of the following effects of your choice for the duration. On each of your turns until the spell ends, you can use your action to target another creature but can’t target a creature again if it has succeeded on a saving throw against this casting of eyebite. 

<b>Asleep</b>&nbsp;
The target galls unconscious. It wakes up if it takes any damage or if another creature uses its action to shake the sleeper awake. 

<b>Panicked</b>&nbsp;
The target is frightened of you. On each of its turns, the frightened creature must take the Dash action and move away from you by the safest and shortest available route, unless there is nowhere to move. If the target moves to a place at least 60 feet away from you where it can no longer see you, this effect ends. 

<b>Sickened</b>&nbsp;
The target has disadvantage on attack rolls and ability checks. At the end of each of its turns, it can make another Wisdom saving throw. If it succeeds, the effect ends.
These crystal lenses fit over the eyes. They have 3 charges. While wearing them, you can expend 1 charge as an action to cast the [[Charm Person]] spell (<<save "Spell DC" 13>>) on a humanoid within 30 feet of you, provided that you and the target can see each other. The lenses regain all expended charges daily at dawn.
These crystal lenses fit over the eyes. While wearing them, you can see much better than normal out to a range of 1 foot. You have advantage on Intelligence (Investigation) checks that rely on sight while searching an area or studying an object within that range.
These crystal lenses fit over the eyes. While wearing them, you have advantage on Wisdom (Perception) checks that rely on sight. In conditions of clear visibility, you can make out details of even extremely distant creatures and objects as small as 2 feet across.
You can read all writing.
You convert raw materials into products of the same material. 
For example, you can fabricate a wooden bridge from a clump of trees, a rope from a patch of hemp, and clothes from flax or wool. 

Choose raw materials that you can see within range. You can fabricate a Large or smaller object (contained within a 10-foot cube, or eight connected 5-foot cubes), given a sufficient quantity of raw material. If you are working with metal, stone, or another mineral substance, however, the fabricated object can be no larger than Medium (contained within a single 5-foot cube). The quality of objects made by the spell is commensurate with the quality of the raw materials. 

Creatures or magic items can’t be created or transmuted by this spell. You also can’t use it to create items that ordinarily require a high degree of craftsmanship, such as jewelry, weapons, glass, or armor, unless you have proficiency with the type of artisan’s tools used to craft such objects.
Each object in a 20-foot cube within range is outlined in blue, green, or violet light (your choice). 
Any creature in the area when the spell is cast is also outlined in light if it fails a Dexterity saving throw. For the duration, objects and affected creatures shed dim light in a 10-foot radius. 

Any attack roll against an affected creature or object has advantage if the attacker can see it, and the affected creature or object can’t benefit from being invisible.
You conjure a phantom watchdog in an unoccupied space that you can see within range, where it remains for the duration, until you dismiss it as an action, or until you move more than 100 feet away from it.

The hound is [[Invisible]] to all creatures except you and can't be harmed. When a Small or larger creature comes within 30 feet of it without first speaking the password that you specify when you cast this spell, the hound starts barking loudly. The hound sees [[Invisible]] creatures and can see into the Ethereal Plane. It ignores illusions.

At the start of each of your turns, the hound attempts to bite one creature within 5 feet of it that is hostile to you. The hound's attack bonus is equal to your spellcasting ability modifier + your proficiency bonus. On a hit, it deals 4d8 piercing damage.
A fall from a great height is one of the most common hazards facing an adventurer.

* At the end of a fall, a creature takes <<bludgeoning 1d6>> ''for every 10 feet'' it fell, to a maximum of <<bludgeoning 20d6>>. 
* The creature lands [[Prone]], unless it avoids taking damage from the fall.
"""
''Mechanical Trap''
"""
This trap uses a trip wire to release a net suspended from the ceiling. The trip wire is 3 inches off the ground and stretches between two columns or trees. The net is
hidden by cobwebs or foliage. 

* ''Net.'' <<ac 10>>, <<hp 20>>.
** Dealing <<slashing 5>> destroys a <<square 5>>of the net, freeing any creature trapped in that section.
** A creature can use its action to make a <<skillcheck Str 10>> to free itself or another creature within reach.

|max top|k
|!Detection |<<perception 10>> to spot the trip wire and net. |
|!Trigger |Breaking the trip wire. |
|!Effect |Net falls on a <<square 10>> area. Creatures in the area are trapped under the net and [[Restrained]]. Those who fail a <<save Str 10>> are knocked [[Prone]]. |
|!Countermeasure |<<thievestools 15>> to disable trip wire. <br/><fail>Trap is triggered</fail>. |
Bolstering yourself with a necromantic facsimile of life, you gain 1d4 + 4 temporary hit points for the duration.
Starting at 3rd level, you can use the bonus action granted by your Cunning Action to make a Dexterity (Sleight of Hand) check, use your thieves’ tools to disarm a trap or open a lock, or take the Use an Object action.
Starting at 5th level, your speed increases by 10 feet while you aren’t wearing heavy armor.
Beginning at 1st level, you have significant experience studying, tracking, hunting, and even talking to a certain type of enemy.

Choose a type of favored enemy: aberrations, beasts, celestials, constructs, dragons, elementals, fey, fiends, giants, monstrosities, oozes, plants, or undead. Alternatively, you can select two races of humanoid (such as gnolls and orcs) as favored enemies.

You have advantage on Wisdom (Survival) checks to track your favored enemies, as well as on Intelligence checks to recall information about them.

When you gain this feature, you also learn one language of your choice that is spoken by your favored enemies, if they speak one at all.

You choose one additional favored enemy, as well as an associated language, at 6th and 14th level. As you gain levels, your choices should reflect the types of monsters you have encountered on your adventures.
"""
''Replaces the [[Favored Enemy]] feature and works with the [[Foe Slayer]] feature''
"""

When you hit a creature with an attack roll, you can call on your mystical bond with nature to mark the target as your favored enemy for 1 minute or until you lose your concentration (as if you were concentrating on a spell).

The first time on each of your turns that you hit the favored enemy and deal damage to it, including when you mark it, you can increase that damage by 1d4.

You can use this feature to mark a favored enemy a number of times equal to your proficiency bonus, and you regain all expended uses when you finish a long rest.

This feature’s extra damage increases when you reach certain levels in this class: to 1d6 at 6th level and to 1d8 at 14th level.
You project a phantasmal image of a creature’s worst fears. Each creature in a 30-foot cone must succeed on a Wisdom saving throw or drop whatever it is holding and become frightened for the duration. 

While frightened by this spell, a creature must take the Dash action and move away from you by the safest available route on each of its turns, unless there is nowhere to move. If the creature ends its turn in a location where it doesn’t have line of sight to you, the creature can make a Wisdom saving throw. On a successful save, the spell ends for that creature.
A feat represents a talent or an area of expertise that gives a character special capabilities. It embodies training, experience, and abilities beyond what a class provides.

At certain levels, your class gives you the Ability Score Improvement feature. Using the optional feats rule, you can forgo taking that feature to take a feat of your choice instead. You can take each feat only once, unless the feat’s description says otherwise.

You must meet any prerequisite specified in a feat to take that feat. If you ever lose a feat’s prerequisite, you can’t use that feat until you regain the prerequisite. For example, the Grappler feat requires you to have a Strength of 13 or higher. If your
Strength is reduced below 13 somehow—perhaps by a withering curse—you can’t benefit from the Grappler feat until your Strength is restored.

<div class="shadow-box" style="column-width: 11em;"><$list filter="[tag[Feat]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>
Reaction: When you or a creature within 60 feet of you falls 

Choose up to five falling creatures within range. A falling creature’s rate of descent slows to 60 feet per round until the spell ends. If the creature lands before the spell ends, it takes no falling damage and can land on its feet, and the spell ends for that creature.
This tiny object looks like a feather. Different types of feather tokens exist, each with a different single-use effect. The DM chooses the kind of token or determines it randomly.

|top|k
| !d100	| !Feather Token | !Description |
| !01-20 |{{Feather Token, Anchor||Link}} |{{Feather Token, Anchor}} |
| !21-35 |{{Feather Token, Bird||Link}} |{{Feather Token, Bird}} |
| !36-50 |{{Feather Token, Fan||Link}} |{{Feather Token, Fan}} |
| !51-65 |{{Feather Token, Swan Boat||Link}} |{{Feather Token, Swan Boat}} |
| !66-90 |{{Feather Token, Tree||Link}} |{{Feather Token, Tree}} |
| !91-00 |{{Feather Token, Whip||Link}} |{{Feather Token, Whip}} |
You can use an action to touch the token to a boat or ship. For the next <<time 24h>>, the vessel can't be moved by any means. Touching the token to the vessel again ends the effect. When the effect ends, the token disappears.
You can use an action to toss the token 5 feet into the air. The token disappears and an enormous, multicolored bird takes its place. The bird has the statistics of a roc, but it obeys your simple commands and can't attack. It can carry up to 500 pounds while flying at its maximum speed (16 miles an hour for a maximum of 144 miles per day, with a one-hour rest for every 3 hours of flying), or 1,000 pounds at half that speed. The bird disappears after flying its maximum distance for a day or if it drops to 0 hit points. You can dismiss the bird as an action.
If you are on a boat or ship, you can use an action to toss the token up to 10 feet in the air. The token disappears, and a giant flapping fan takes its place. The fan floats and creates a wind strong enough to fill the sails of one ship, increasing its speed by 5 miles per hour for 8 hours. You can dismiss the fan as an action.
You can use an action to touch the token to a body of water at least 60 feet in diameter. The token disappears, and a 50-foot-long, 20-foot- wide boat shaped like a swan takes its place. The boat is self-propelled and moves across water at a speed of 6 miles per hour. You can use an action while on the boat to command it to move or to turn up to 90 degrees. The boat can carry up to thirty-two Medium or smaller creatures. A Large creature counts as four Medium creatures, while a Huge creature counts as nine. The boat remains for <<time 24h>> and then disappears. You can dismiss the boat as an action.
You must be outdoors to use this token. You can use an action to touch it to an unoccupied space on the ground. The token disappears, and in its place a nonmagical oak tree springs into existence. The tree is 60 feet tall and has a 5-foot-diameter trunk, and its branches at the top spread out in a 20-foot radius.
You can use an action to throw the token to a point within 10 feet of you. The token disappears, and a floating whip takes its place. You can then use a bonus action to make a melee spell attack against a creature within <<reach 10>> of the whip, with an <<melee Whip +9>>. On a hit, the target takes <<force 1d6+5>>. As a bonus action on your turn, you can direct the whip to fly up to 20 feet and repeat the attack against a creature within 10 feet of it. The whip disappears after <<time 1h>>, when you use an action to dismiss it, or when you are [[Incapacitated]] or die.
You blast the mind of a creature that you can see within range, attempting to shatter its intellect and personality. The target takes 4d6 psychic damage and must make an Intelligence saving throw. 

On a failed save, the creature’s Intelligence and Charisma scores become 1. The creature can’t cast spells, activate magic items, understand language, or communicate in any intelligible way. The creature can, however, identify its friends, follow them, and even protect them. 

At the end of every 30 days, the creature can repeat its saving throw against this spell. If it succeeds on its saving throw, the spell ends. 
The spell can also be ended by greater restoration, heal or wish.
By 7th level, your instincts are so honed that you have advantage on initiative rolls.

Additionally, if you are surprised at the beginning of combat and aren’t incapacitated, you can act normally on your first turn, but only if you enter your rage before doing anything else on that turn.
At 18th level, you gain preternatural senses that help you fight creatures you can’t see. When you attack a creature you can’t see, your inability to see it doesn’t impose disadvantage on your attack rolls against it.

You are also aware of the location of any invisible creature within 30 feet of you, provided that the creature isn’t hidden from you and you aren’t blinded or deafened.
Fey are magical creatures closely tied to the forces of nature. They dwell in twilight groves and misty forests. In some worlds, they are closely tied to the Feywild, also called the Plane of Faerie. Some are also found in the Outer Planes, particularly the planes of Arborea and the Beastlands. Fey include dryads, pixies, and satyrs.

<<list-box "[tag[Fey]sort[]]" "No fey found.">>
You have advantage on saving throws against being charmed, and magic can’t put you to sleep.
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fy3AD2jef6jtP+D7zwhsTiLohMzozMptOmjEpBz6rVOM1qIdeut7gNZ7/k8lCMXprXbF36nWrL5ze4PUTP5+98of6/1ydYA1j4N4gYYLgImHjHCNnoKBZZKTkpZal5iQm0+cnZGQNKGirKUpqqd9qi6rrKevI6CxsrQltlgItl+7Gbq/gL1rsh/KRrTESMkXwc3Hy2PAHthEzNIx1x3WS9fZS94M39LO4GjlDOS57ec86u/o4tHa98QP/de49vr5+T39/OAcBY4hIMI9TvVEEF6tYxCWdskjCGdYKhO+gQI8X+X4ngadrYjV+9bl4u7hrUMCOjiyRFRiNZ0iWtPilhQkLn0KQ8m11kzrTDy98nnQFVVuS5DybRn2mCulp6FONDhACgzmo6rBbSfS+lem0XtRmlkYE2TjXq01/aoh7FajlIR6TBcWjXQrF7d2tVvEf1FhpD1ildc37zvjS6d6tVthr5mvIUeOpgwogZUx6JeHFYzJstKfnatuvOynnrZna5TnNi0jIdHwqisRpfxa4Tix5tWG1l1bZ1D/3RmLXZ2KXPjubJgOvhhuZA+QhOmxzp3JYjF7U7V7l2zmpJqYnWF3lh37gxy53eIyVl9DrH/x3lbGnt7ssP8y4zjS76SPD+gbV3HxBoAXrGhX4PVfJCTCzt1xx0EUGllGMArtHKF8n15NeFbqWWkWsTmrECiMPFt9t9yaTFm4lsxEFhdlZo5iI7KEo434qy2FijbuIB1JuOxN1kwhwxkpjThxv6aN5HJJRl5Gr8qOjNebPlKMcIr1FZGkQ8hqeaVQxaeItWTWq45XoCgmUIHqZsI9BVMH6pYAdpDvlKMb9NCecVvixCp3NL8kdjk/5lgCCUV1LgpAR8BirooH4AiiWOFuiYn1bMzWknpI3GWYF9ipZ16WMaFBopho96+mmVevXZhpVA/hcXM7JNqmqSosr5KpkinioUqtrgeNytVKykZYu8knf+HKLGmnnojYsaWlOlSUFXoLHPQOsoCrm2Kiuq0VYrJLazorKoqrSal+Kx+Imrnwvv5enrA+Al6qJK6nIqJgyScNupPFyCJJ6y65b6rb6xSiotsql6KTCYm8Yrw0T9TksvQgw3jE194X6Gy8TrWTRxnx5nTCmTUbiZ8L9ZVjriym3Ws3KsmRC88a9JIUOoyh+/7K3MJ1eUSsr/XptzxcnqOm8gQ39H3SapUmoSB0sf3fKrUDPdGak8X5edB0t3CC6kO0fsL4Fbf0201y6vFXa5VCdoHaZIo5222hWzffa+EFcYd7NV2xzm2hdXLXPBfGf1brFca/in4HgrDqrhIcr+lvjg8jouNd32Ql7ruAbPmq9p1Wqr+easrpvt4c74/DjgLN7NOeEOv0i2ng+XfPPoKpQe8O1o2g63gpK+/TLfIxdno8PukkFz1phbvDzsczffI6eTo868Td1+Ln3sm1If/K5xXr1wf91D3qjv5we+LPBFevzduQPSbu71/DpKvFnPPY/dh9STH6TCeW5vqAEO/7gzmfq9ToA16RXdeLc7x9GnL5QLXQnec5bWtIRxSFicdDQYKGGxrxbo4hAIpZSE8OBOhX2rGene1TOddSYTQFsc1JImwmERK3cmJBxgeHjDb+QqgFbzIADhhTLFKVF97bogqYzoQXYFbWvF+h/+kZxIIMEdMSRbiOIJpWQ2IiqJipeDoPnCVkatYdFpZLQY/9RQtyXObYiu8pOuyoizKewFbQD0jrPuJMcLPYmGg6SK0fwoRjbeEXp5/EzUDGnIMDYOkMMpHk4c+chFck5TkxyjJiFCEUwu6JOne1YnPRnIrjEkhVqC5BzpqCY7kjKTowROK2dpRevFkpKVFGRyYEMIV24SljrkZYw4CEpbIvOYryTWGhWJyzgaRJnLJEreiLknWaaykDWgQffWdkRE1tGY1gSYQLypO2Y205QjRGUv56KoiLlOncN05jihuc3SrW9Jn9qmFK3VTkm+E4Xy0hfL6Ck7du4SnwNtZDz+K3TQcq5TbgFVY0PNuE9f9KuhpaToQt2JUDMqAhXnQmhHc5gpcn7xjfDcXUklWk+PflSg9BSpLlzqB5P+c2CnpClMbXrTG23viyf120wtWtOMrlIWRYNpQitXUU6+E6j2CJKdnLpTnt4TpBKlalD5Oaqm3U2cW/UpCFl6Titlrnpj1WZUsblBr15yWLgiai5N1VOkllOuVcWD3TYYU5kWU6UcQisXqJBNwD4VqkeV6jH5Olc56bCHWdVqWeHaEshGdlSxpOxd3fdMx1bSsL/KXGejSNa8zmlqPCyG1Mp6TXuG1m1aHJtkcwbb2Aq2sSRErW1fS6jQ+hKJ2fsjpoD++FvgTiqRh2Trbt9qLqol12DMRR9xQctcpflqusqdxgtdhg/ZZjdc0eJudwv0XXrtRKGzvV95vYhY7y4woZ81L64il0HFMlUb9jtpfTUrNBFla4t0vVx/VcREAvM2JqBVsEYLeuAa1Vd1Am5wa/0azAjD6a7hK67yhOOq4bbXuRUEaAQHptUrujaZC3ZefEy8QOFZVpfKCuV9gYHi4kYPQ/zaaU5rebxBtQ+vFF5djy23n9Jys23BKs+QaddhIysQQpGMV25028ebkRfK3EugC+n0NFuBbD42uxp+m1hkmBmVyhg7cpmHdiUVp1mIjAVz0bgsPyheIr9dxiFKLxz+YMgS71mSs194Mdu7TA0Wc0XMH7nWq9eW/fXG8DWbox+NLNFOT9Ephe91Z+dgQ9/FrXnjdLccfKdQGzrBRGZyU0/Nu1IsGTJ7nGKAH3WvQEeaY6rIM2kxCuiiInp/dfJ1RiEYbGFrmthMCXL5XB3kp3TwRMaeZ5WVuiFmP6jalpyjsTnizWvAWoK1VfV/UTpianPbnEhmMjT6zKZxJ4qF9q0sqccbpVyD8dLK3nZ63yHvOgic3/1Wd7rpuKto89nd9Dh4nQtebyp9OyHQRfc/75Vsexuc0qJ18ocZDuwyERzkogqVjt3dZpGPfKKhezHCeBZmlRea5C33j8kwLvP+EuL85vA6d87FG1b2gnpLPn/uzt2cY4prfNkB/7L49MHyZi+adcBqeBzzfdmXV51HSzd6p13Y4zJ1fc1TN3HYiS7hoq/8zkeun8jvE9gvO9zCW0d7hkLC9Ba7b8sqf9O98U1kvr8dL6yW878/LKSfrwbSZo2x8hTPJMZfh+dzFjLkfaYdLGM3yqa6POYjPmXzydjzbgc9jEXfedKX/mOXSTitU6/6s0PZ9bAZOuJij0CbnzyFo4cL7nNfYhpPG3jj+n0NF0+/j9OQ+KCLPbtxrHw98phEDRK76U5DtN13kfnFRxLFgR9E4b+F+3z2PvLzfSbzbx4NsG8MYbi0EBD+f3rm45/9jxSmX7WDKYMWr7/lm4wk+bdYYPd+/Ed5j4BXFLMzK5QlQPc+BiJ3KNFqrzQkIpNL5oQ882NytOcI2mc5zMJ4I+JPx+dcZBZ1BCSB0edxFOR7GciAjAFYrfde0dcJ9gSCGkNiLnZlMuiCtuKBCpE424GDhIcU/aNfQfEw5zB/Lah+t5GDYlUdUegkYPBy8xBnQuiERCg6ThgzZWNZ7vB5PDiE0dFCUDhvmSZ+4OBm12eAZqiDbnh+njZ/SphGKYaF26GFZRiHWfaFdAhxTCiFDJiHOBiIbrCGfniCwaeBQjiIK8iCDoiIiahj9oGGlViIY7d2kbiEG9iQgJb4hnsIf2SniTR3epJGhoTYhRY0iroWekVohCVEgqK4iikna6jxiOSza7M4cQzFRV3Fi7q4VtImbsA4d8aHgsQYjMa4cMhYjMbHjJynjEr1jHoHedNoQL9njbx3edn4Q33HjWFgd9+IFQAnjin4buUoCuCGjsuQWuuohOzljtOIZvFIj/Voj/eIj/noAgUAADs=
Fiends are creatures of wickedness that are native to the Lower Planes. A few are the servants of deities, but many more labor under the leadership of archdevils and demon princes. Evil priests and mages sometimes summon fiends to the material world to do their bidding. If an evil celestial is a rarity, a good fiend is almost inconceivable. Fiends include [[Demon]], [[Devil]], [[Hell Hound]], [[Rakshasa]], and [[Yugoloth]].

<<list-box "[tag[Fiend]sort[]]" "No fiends found.">>
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !Spells Known | !Spell Slots | !Slot Level | !Invocations Known |
| !1st | +2 |[[Pact Magic]], ''Fiend:'' [[Expanded Spell List|Fiend Expanded Spell List]], [[Dark One’s Blessing]] | 2 | 2 | 1 | 1st | — |
| !2nd | +2 |[[Eldritch Invocations]] | 2 | 3 | 2 | 1st | 2 |
| !3rd | +2 |[[Pact Boon]] ([[Blade|Pact of the Blade]] / [[Chain|Pact of the Chain]] / [[Tome|Pact of the Tome]]) | 2 | 4 | 2 | 2nd | 2 |
| !4th | +2 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 3 | 5 | 2 | 2nd | 2 |
| !5th | +3 |— | 3 | 6 | 2 | 3rd | 3 |
| !6th | +3 |''Fiend:'' [[Dark One’s Own Luck]] | 3 | 7 | 2 | 3rd | 3 |
| !7th | +3 |— | 3 | 8 | 2 | 4th | 4 |
| !8th | +3 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 3 | 9 | 2 | 4th | 4 |
| !9th | +4 |— | 3 | 10 | 2 | 5th | 5 |
| !10th | +4 |''Fiend:'' [[Fiendish Resilience]] | 4 | 10 | 2 | 5th | 5 |
| !11th | +4 |[[Mystic Arcanum (6th level)]] | 4 | 11 | 3 | 5th | 5 |
| !12th | +4 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 11 | 3 | 5th | 6 |
| !13th | +5 |[[Mystic Arcanum (7th level)]] | 4 | 12 | 3 | 5th | 6 |
| !14th | +5 |''Fiend:'' [[Hurl Through Hell]] | 4 | 12 | 3 | 5th | 6 |
| !15th | +5 |[[Mystic Arcanum (8th level)]] | 4 | 13 | 3 | 5th | 7 |
| !16th | +5 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 13 | 3 | 5th | 7 |
| !17th | +6 |[[Mystic Arcanum (9th level)]] | 4 | 14 | 4 | 5th | 7 |
| !18th | +6 |— | 4 | 14 | 4 | 5th | 8 |
| !19th | +6 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 15 | 4 | 5th | 8 |
| !20th | +6 |[[Eldritch Master]] | 4 | 15 | 4 | 5th | 8 |
The Fiend lets you choose from an expanded list of spells when you learn a warlock spell. The following spells are added to the warlock spell list for you.

| !Spell Level | !Spells |
| !1st |[[Burning Hands]], [[Command]] |
| !2nd |[[Blindness/Deafness]], [[Scorching Ray]] |
| !3rd |[[Fireball]], [[Stinking Cloud]] |
| !4th |[[Fire Shield]], [[Wall of Fire]] |
| !5th |[[Flame Strike]], [[Hallow]] |
You have made a pact with a fiend from the lower planes of existence, a being whose aims are evil, even if you strive against those aims. Such beings desire the corruption or destruction of all things, ultimately including you. Fiends powerful enough to forge a pact include demon lords such as Demogorgon, Orcus, Fraz’Urb-luu, and Baphomet; archdevils such as Asmodeus, Dispater, Mephistopheles, and Belial; pit fiends and balors that are especially mighty; and ultroloths and other lords of the yugoloths.

<<include "Fiend Advancement Table">>

---

!! Fiend Patron Abilities

<<include "Fiend Expanded Spell List">>
<<include "Dark One’s Blessing">>
<<include "Dark One’s Own Luck">>
<<include "Fiendish Resilience">>
<<include "Hurl Through Hell">>

---

<<include "Warlock Ability">>
Starting at 10th level, you can choose one damage type when you finish a short or long rest. You gain resistance to that damage type until you choose a different one with this feature. Damage from magical weapons or silver weapons ignores this resistance.
You can cast false life on yourself at will as a 1st-level spell, without expending a spell slot or material components.
As a fighter, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d10 per fighter level
''Hit Points at 1st Level:'' 10 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d10 (or 6) + your Constitution modifier per fighter level after 1st
"""

!!! Proficiencies

"""
''Armor:'' All armor, shields
''Weapons:'' Simple weapons, martial weapons
''Tools:'' None
''Saving Throws:'' Strength, Constitution
''Skills:'' Choose two skills from Acrobatics, Animal Handling, Athletics, History, Insight, Intimidation, Perception, and Survival
"""

!!! Equipment
You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) chain mail or (b) leather armor, longbow, and 20 arrows
(a) a martial weapon and a shield or (b) two martial weapons
(a) a light crossbow and 20 bolts or (b) two handaxes
(a) a dungeoneer’s pack or (b) an explorer’s pack
"""

!!! Subclasses

<<list-box "[tag[Fighter]tag[Subclass]sort[]]">>

!!! Advancement Table

{{||FighterAdvancementTemplate}}
{{||ClassAbilityTemplate}}

<<sections-vertical  "[[Fighter Fighting Style]] [[Second Wind]] [[Action Surge]] [[Martial Archetype]] [[Fighter Ability Score Improvement]] [[Fighter Extra Attack]] [[Indomitable]]">>
When you reach 4th level, and again at 6th, 8th, 12th, 14th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Fighter Ability Score Improvement}}
{{Fighter Ability Score Improvement}}
{{Fighter Ability Score Improvement}}
{{Fighter Ability Score Improvement}}
{{Fighter Ability Score Improvement}}
{{Fighter Ability Score Improvement}}
| !Level | !Proficiency Bonus | !Features |
| !1st | +2 |[[Fighting Style|Fighter Fighting Style]], [[Second Wind]] |
| !2nd | +2 |[[Action Surge]] (one use) |
| !3rd | +2 |[[Martial Archetype]] |
| !4th | +2 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !5th | +3 |[[Extra Attack|Fighter Extra Attack]] |
| !6th | +3 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !7th | +3 |Martial Archetype Feature |
| !8th | +3 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !9th | +4 |[[Indomitable]] (one use) |
| !10th | +4 |Martial Archetype Feature |
| !11th | +4 |[[Extra Attack|Fighter Extra Attack]] (2) |
| !12th | +4 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !13th | +5 |[[Indomitable]] (two uses) |
| !14th | +5 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !15th | +5 |Martial Archetype Feature |
| !16th | +5 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !17th | +6 |[[Action Surge]] (two uses), [[Indomitable]] (three uses) |
| !18th | +6 |Martial Archetype Feature |
| !19th | +6 |[[Ability Score Improvement|Fighter Ability Score Improvement]] |
| !20th | +6 |[[Extra Attack|Fighter Extra Attack]] (3) |
Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.

The number of attacks increases to three when you reach 11th level in this class and to four when you reach 20th level in this class.
{{Fighter Extra Attack}}
{{Fighter Extra Attack}}
You adopt a particular style of fighting as your specialty. Choose one of the following options. You can’t take a Fighting Style option more than once, even if you later get to choose again.

<$list filter="[tag[Fighting Style]tag[Fighter]sort[]]"><p>{{||Link}}''.'' <$transclude tiddler=<<currentTiddler>>/></p></$list>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsOi8fksvmMTqvX7Lb7DY/L5/S6/Y7P6/f8vv8PGCg4eAYAQAhoqIjYp+jIqOf4CHknOUlZZ7mISad5yQnn+QnqJrpJ+mZ6ilpqyhrn+toqKutwKKZau7D6lavrOeb7GhsmTKp6W0zMiZwMhgzaXAbdwVtIPW2MIanW7EyGfWGZ5v0Nrj2hiVZuSI4eoW7G3t69DB9/Pm+eTSsxyq9vXz5gEP4NDEhvnT0FBoMhHOeu366Gyh5CVCgxAcX+ZxYJYvSIDx6WjgsPQrzoT+CGhCBYFiT5DpcrbhWscbCpAScDmNKuebNAs5pOcUMZ8uwJMKatoDmZZkD54Cg7eUjTQSXqFOjVBlLnJc14L2RNj2PFcu2KUKbSnSWXrjUKli3ajr3KhX2r7+XbANDmBqySNmpevjwNDD6b0a9XKg8FK1bs1uxju4wbI56M9vJWwpjjQqErt7PU0JsNizbrpPDE00dXo9bIumiSoIFhx4YJ97Xt2FOy/t192yLwrJo79274+0Bw3Mo9RzYehTjnw9OX1277fLIU6dUXd7e+GLtjzJ83mg4MXrh4vY/Lyz7/N31j5xTIp+ae26v8tGT+n7Z/UpprU+0XX4D1Qebee8P1RaB++JU1V3QPksZgg3ZNCOFogPn3k4UDKnhgZmxc6GGHLnkQ4Sy5lGgiCSKmUiGL693UlRwxytjfCBraOBOOM9LIXCe0+PjjSkFmAgyR9KF4pB1JKqkbk6BFMg6UUQolXCPcWGkgkLVpuQiXGDb1pR+PiGmel1MREiaaJ4aQHJuHuPnmB3EiMiedJnjHjJ4urnmMnzpShgqdKhn50zCCwlkVK4YOGo6ibkJaJCOPMlopJJfamSklm0rZpaOLqlmnLs1NCqqpKaF6k6oZcunqC5/GqsKstKJg6617jqrrrqz2ekKuwIog7LAt8Wr+LKZoJuvrssz++euzx0YrLahiVkssstiS6ey21sLq7bdWhisulORi2e25HKarLlbstvvquPBuo+287F1rr1bU5nsvuPxate+/xckr8F34FtwvwQhnp/DCFDbscH7+RizgxBQvaO7FFUN8cZ4BO9xOsQi3+XHBZ9Yr8JYo81vlyvaq82ip8D45KYjYDqlnmtv2WLPO0sYS85jJEhO00MAuU7TRt9qTtNKuLtS0z7SWFLXUpmJXtdWyiJe11oUu+V3GkU4NdthKnlq2qDlunDF8a9eyl9lEYuy1nGnL7aPEoWpaaa5jB3q32xaj/bannRb7N9+BI4By4nYXPt7gdNv+vEenjJcs+N6VL6733AZfyYflk8sIMOdCQr6q5AM7DQvqpXPMMOsqyv5w3vq6ziPuIcKeMOUjmt47jutq/rvu8QrPLfERgU4v76/TrhbzzbedPPR1GT+956TWzRH22SNfrsw+Sb+9h9l674Xow5tPqfJcqF89gc26nwX8iDaIK/BW2F/+crXqfxz0nU8+K+DffQTYPv+xwIBLYGD4TiMrADLBgdO6TQwoSAQMVlA0NNAgEDy4Qe3UAIQ8IKGyEHQDBBrBhANMUQ5UOAQWJlA1JSTfCmUIrdb8wIYxjFsPdPhB+u0Qh/mbUhB4GEQY4sCIPeReDZW4xDJl0Ik7kGB1FamDBCrqAIpbBFQDfecDISbRcUcAYxjNKIRG3YdcPizjoYZFRBmI72hI1JgNxGjHDqIxjyOcIx/D+MdACnKQhCykIQ+JyEQqcpGMbKQjHwnJSEpykpSspCUviclManKTnOykJz8JylCKcpSkLKUpT4lKgRUAADs=
|top|k
| !Level | !Proficiency Bonus | !Features |
| !1st | +2 |<<list-abilities 1>> |
| !2nd | +2 |<<list-abilities 2>> |
| !3rd | +2 |<<list-abilities 3>> |
| !4th | +2 |<<list-abilities 4>> |
| !5th | +3 |<<list-abilities 5>> |
| !6th | +3 |<<list-abilities 6>> |
| !7th | +3 |<<list-abilities 7>> |
| !8th | +3 |<<list-abilities 8>> |
| !9th | +4 |<<list-abilities 9>> |
| !10th | +4 |<<list-abilities 10>> |
| !11th | +4 |<<list-abilities 11>> |
| !12th | +4 |<<list-abilities 12>> |
| !13th | +5 |<<list-abilities 13>> |
| !14th | +5 |<<list-abilities 14>> |
| !15th | +5 |<<list-abilities 15>> |
| !16th | +5 |<<list-abilities 16>> |
| !17th | +6 |<<list-abilities 17>> |
| !18th | +6 |<<list-abilities 18>> |
| !19th | +6 |<<list-abilities 19>> |
| !20th | +6 |<<list-abilities 20>> |
A figurine of wondrous power is a statuette of a beast small enough to fit in a pocket. If you use an action to speak the command word and throw the figurine to a point on the ground within 60 feet of you, the figurine becomes a living creature. If the space where the creature would appear is occupied by other creatures or objects, or if there isn’t enough space for the creature, the figurine doesn’t become a creature.

The creature is friendly to you and your companions. It understands your languages and obeys your spoken commands. If you issue no commands, the creature defends itself but takes no other actions. See the Monster Manual for the creature’s statistics, except for the giant fly.

The creature exists for a duration specific to each figurine. At the end of the duration, the creature reverts to its figurine form. It reverts to a figurine early if it drops to 0 hit points or if you use an action to speak the command word again while touching it. When the creature becomes a figurine again, its property can’t be used again until a certain amount of time has passed, as specified in the figurine’s description.
{{Figurine of Wondrous Power}}

''Bronze Griffon.'' This bronze statuette is of a <<mob Griffon>> rampant. It can become a griffon for up to <<time 6h>>. Once it has been used, it can’t be used again until <<time 5d>> have passed.
{{Figurine of Wondrous Power}}

''Ebony Fly.'' This ebony statuette is carved in the likeness of a horsefly. It can become a <<mob "Giant Fly">> for up to <<time 12h>> and can be ridden as a mount. Once it has been used, it can’t be used again until <<time 2d>> have passed.
{{Figurine of Wondrous Power}}

''Golden Lions.'' These gold statuettes of lions are always created in pairs. You can use one figurine or both simultaneously. Each can become a <<mob Lion>> for up to <<time 1h>>. Once a <<mob Lion>> has been used, it can’t be used again until <<time 7d>> have passed.
{{Figurine of Wondrous Power}} 

''Ivory Goats.'' These ivory statuettes of goats are always created in sets of three. Each <<mob Goat>> looks unique and functions differently from the others. Their properties are as follows:

* The ''Goat of Traveling'' can become a Large goat with the same statistics as a riding horse. It has 24 charges , and each hour or portion thereof it spends in beast form costs 1 charge. While it has charges, you can use it as often as you wish. When it runs out of charges, it reverts to a figurine and can't be used again until <<time 7d>> have passed , when it regains all its charges.
* The ''Goat of Travail'' becomes a giant goat for up to <<time 3h>>. Once it has been used, it can't be used again until <<time 30d>> have passed.
* The ''Goat of Terror'' becomes a giant goat for up to <<time 3h>>. The goat can't attack, but you can remove its horns and use them as weapons. One horn becomes a +1 Lance, and the other become s a +2 Longsword. Removing a horn requires an action, and the weapons disappear and the horns return when the goat reverts to figurine form. In addition, the goat radiates a 30-foot-radius aura of terror while you are riding it. Any creature hostile to you that starts its turn in the aura must succeed on a <<save Wis 15>> or be [[Frightened]] of the goat for <<time 1m>>, or until the goat reverts to figurine form. The frightened creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. Once it successfully saves against the effect, a creature is immune to the goat's aura for the next <<time 24h>>. Once the figurine has been used, it can't be used again until <<time 15d>> have passed.
{{Figurine of Wondrous Power}}

''Marble Elephant.'' This marble statuette is about 4 inches high and long. It can become an <<mob Elephant>> for up to <<time 24h>>. Once it has been used, it can’t be used again until <<time 7d>> have passed.
{{Figurine of Wondrous Power}}

''Obsidian Steed.'' This polished obsidian horse can become a <<mob Nightmare>> for up to <<time 24h>>. The <<mob Nightmare>> fights only to defend itself. Once it has been used, it can’t be used again until <<time 5d>> have passed.

If you have a good alignment, the figurine has a 10 percent chance each time you use it to ignore your orders, including a command to revert to figurine form. If you mount the <<mob Nightmare>> while it is ignoring your orders, you and the nightmare are instantly transported to a random location on the plane of Hades, where the <<mob Nightmare>> reverts to figurine form.
{{Figurine of Wondrous Power}}

''Onyx Dog.'' This onyx statuette of a dog can become a <<mob Mastiff>> for up to <<time 6h>>. The <<mob Mastiff>> has an Intelligence of 8 and can speak Common. It also has darkvision out to a range of 60 feet and can see invisible creatures and objects within that range. Once it has been used, it can’t be used again until <<time 7d>> have passed.
{{Figurine of Wondrous Power}}

''Serpentine Owl.'' This serpentine statuette of an owl can become a <<mob "Giant Owl">> for up to <<time 8h>>. Once it has been used, it can’t be used again until <<time 2d>> have passed. The owl can telepathically communicate with you at any range if you and it are on the same plane of existence.
{{Figurine of Wondrous Power}}

''Silver Raven.'' This silver statuette of a raven can become a <<mob Raven>> for up to <<time 12h>>. Once it has been used, it can’t be used again until <<time 2d>> have passed. While in <<mob Raven>> form, the figurine allows you to cast the [[Animal Messenger]] spell on it at will.
You gain the service of a familiar, a spirit that takes an animal form you choose: bat, cat, crab, frog (toad), hawk. lizard, octopus, owl, poisonous snake, fish (quipper), rat, raven, sea horse, spider, or weasel. Appearing in an unoccupied space within range, the familiar has the statistics of the chosen form, though it is a celestial, fey or fiend (your choice) instead of a beast. 

Your familiar acts independently of you, but it always obeys your commands. In combat, it rolls its own initiative and acts on its own turn. A familiar can’t attack, but it can take other actions as normal. 

When the familiar drops to 0 hit points, it disappears, leaving behind no physical form. It reappears after you cast this spell again. 

While your familiar is within 100 feet of you, you can communicate with it telepathically. Additionally, as an action, you can see through your familiar’s eyes and hear what it hears until the start of your next turn, gaining the benefits of any special senses that the familiar has. During this time, you are deaf and blind with regard to your own senses. 

As an action, you can temporarily dismiss your familiar. It disappears into a pocket dimension where it awaits you summons. Alternatively, you can dismiss it forever. As an action while it is temporarily dismissed, you can cause it to reappear in any unoccupied space within 30 feet of you. 

You can’t have more than one familiar at a time. If you cast this spell while you already have a familiar, you instead cause it to adopt a new form. Choose one of the forms from the above list. Your familiar transforms into the chosen creature. 

Finally, when you cast a spell with a range of touch, your familiar can deliver the spell as if it had cast the spell. Your familiar must be within 100 feet of you, and it must use its reaction to deliver the spell when you cast it. If the spell requires an attack roll, you use your attack modifier for the roll.
You summon a spirit that assumes the form of an unusually intelligent, strong, and loyal steed, creating a long-lasting bond with it. Appearing in an unoccupied space within range, the steed takes on a form that you choose, such as a warhorse, a pony, a camel, an elk, or a mastiff. (Your DM might allow other animals to be summoned as steeds.) The steed has the statistics of the chosen form, though it is a celestial, fey, or fiend (your choice) instead of its normal type. Additionally, if your steed has an Intelligence of 5 or less, its Intelligence becomes 6, and it gains the ability to understand one language of your choice that you speak.

Your steed serves you as a mount, both in combat and out, and you have an instinctive bond with it that allows you to fight as a seamless unit. While mounted on your steed, you can make any spell you cast that targets only you also target your steed.

When the steed drops to 0 hit points, it disappears, leaving behind no physical form. You can also dismiss your steed at any time as an action, causing it to disappear. In either case, casting this spell again summons the same steed, restored to its hit point maximum.

While your steed is within 1 mile of you, you can communicate with it telepathically. You can’t have more than one steed bonded by this spell at a time. As an action, you can release the steed from its bond at any time, causing it to disappear.
This spell allows you to find the shortest, most direct physical route to a specific fixed location that you are familiar with on the same plane of existence. If you name a destination on another plan of existence, a destination that moves (such as a mobile fortress), or a destination that isn’t specific (such as "a green dragon’s lair”), the spell fails.

For the duration, as long as you are on the same plane of existence as the destination, you know how far it is and in what direction it lies. While you are traveling there, whenever you are presented with a choice of paths along the way, you atomatically determine which path is the shortest and most direct route (but not necessarily the safest route) to the destination.”
You sense the presence of any trap within range that is within line of sight.
A trap, for the purpose of this spell, includes anything that would inflict a sudden or unexpected effect you consider harmful or undesirable, which was specifically intended as such by its creator. Thus, the spell would sense an area affected by the alarm spell, a glyph of warding, or a mechanical pit trap, but it would not reveal a natural weakness in the floor, an unstable ceiling, or a hidden sinkhole.

This spell merely reveals that a trap is present. You don’t learn the location of each trap, but you do learn the general nature of the danger posed by a trap you sense.
You send negative energy coursing through a creature that you can see within range, causing it searing pain.  The target must make a Constitution saving throw. It takes 7d8 + 30 necrotic damage on a failed save, or half as much damage on a successful one.

A humanoid killed by this spell rises at the start of your next turn as a [[Zombie]] that is permanently under your command, following your verbal orders to the best of its ability.
You hurl a mote of fire at a creature or object within range. Make a ranged spell attack against the target. On a hit, the target takes 1d10 fire damage. A flammable object hit by this spell ignites if it isn’t being worn or carried.
"""
''Fire Form.'' The elemental can move through a space as narrow as 1 inch wide without squeezing. A creature that touches the elemental or hits it with a melee attack while with in 5 feet of it takes <<fire 1d10>>. In addition, the elemental can enter a hostile creature's space and stop there. The first time it enters a creature's space on a turn, that creature takes <<fire 1d10>> and catches fire; until someone takes an action to douse the fire, the creature takes <<fire 1d10>> at the start of each of its turns.
''Illumination.'' The elemental sheds <<bright>> in a <<range 30>> radius and <<dim>> in another <<range 30>>.
''Water Susceptibility.'' For every 5 feet the elemental moves in water, or for every gallon of water splashed on it, it takes <<cold 1>>.
"""
<<divider>>
''Multiattack.'' The elemental makes two touch attacks.

|max|k
| !<<action>> Actions |<|<|
|^ !<<melee Touch +6>>|<<fire 2d6+3>> |<<reach 5>> |
|~|If the target is a creature or a flammable object, it ignites. Until a creature takes an action to douse the fire, the target takes <<fire 1d10>> at the start of each of its turns. |<|
''Multiattack.'' The giant makes two greatsword attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +11>>|<<slashing 6d6+7>> |<<reach 10>> |
| !<<ranged Rock +11>>|<<bludgeoning 4d10+7>> |<<range 60/240>> |
Thin and wispy flames wreathe your body for the duration, shedding bright light in a 10-foot radius and dim light for an additional 10 feet, You can end the spell early by using an action to dismiss it.

The flames provide you with a warm shield or a chill shield, as you choose. The warm shield grants you resistance to cold damage, and the chill shield grants you resistance to fire damage.

In addition, whenever a creature within 5 feet of you hits you with a melee attack, the shield erupts with flame. The attacker takes 2d8 fire damage from a warm shield, or 2d8 cold damage from a cold shield.
The device produces a miniature flame, which you can use to light a candle, torch, or campfire. Using the device requires your action.
A storm made up of sheets of roaring flame appears in a location you choose within range. 
The area of the storm consists of up to ten 10-foot cubes, which you can arrange as you wish. Each cube must have at least one face adjacent to the face of another cube. Each creature in the area must make  Dexterity saving throw. It takes 7d10 fire damage on a failed save, or half as much damage on a successful one.

The fire damages objects in the area and ignites flammable objects that aren’t being worn or carried. If you choose, plant life in the area is unaffected by this spell.
"""
''Magic Trap''
"""
This trap is activated when an intruder steps on a hidden pressure plate, releasing a magical gout of flame from a nearby statue. The statue can be of anything, including a dragon or a wizard casting a spell.

|max top|k
|!Detection #1 |<<perception 15>> to spot the pressure plate, as well as faint scorch marks on the floor and walls. |
|!Detection #2 |Spell or other effect that sense the presence of magic, such as [[Detect Magic]], reveals an aura of evocation magic around the statue. |
|!Trigger |20 or more pounds of weight is placed on the pressure plate. |
|!Effect |Statue releases a <<cone 30>> of fire. Each creature <<save Dex 13>>, taking <fail><<fire 4d10>></fail>, or <pass><<halved>></pass> |
|!Countermeasure #1 |Wedge an iron spike or other object under the pressure plate. |
|!Countermeasure #2 |A successful [[Dispel Magic]] <<skillcheck "Dispel DC" 13>> on the statue destroys the trap. |
A bright streak flashes from your pointing finger to a point you choose within range then blossoms with a low roar into an explosion of flame.
Each creature in a 20-foot radius must make a Dexterity saving throw. A target takes 8d6 fire damage on a failed save, or half as much damage on a successful one. The fire spreads around corners.&nbsp;It ignites flammable objects in the area that aren’t being worn or carried.&nbsp;
You evoke a fiery blade in your free hand. 
The blade is similar in size and shape to a scimitar, and it lasts for the duration. If you let go of the blade, it disappears, but you can evoke the blade again as a bonus action.

You can use your action to make a melee spell attack with the fiery blade. On a hit, the target takes 3d6 fire damage. 
The flaming blade sheds bright light in a 10-foot radius and dim light for an additional 10 feet.
A vertical column of divine fire roars down from the heavens in a location you specify. Each creature in a 10-foot radius, 40-foot-high cylinder centered on a point within range must make a Dexterity saving throw. A creature takes 4d6 fire damage and 4d6 radiant damage on a failed save, or half as much damage on a successful one.&nbsp;
You can use a bonus action to speak this magic sword’s command word, causing flames to erupt from the blade. These flames shed <<bright 40>> and an additional <<dim 40>>. While the sword is ablaze, it deals an extra <<fire 2d6>> to any target it hits. The flames last until you use a bonus action to speak the command word again or until you drop or sheathe the sword.
A 5-foot-diameter sphere of fire appears in an unoccupied space of your choice within range and lasts for the duration. 
Any creature that ends its turn within 5 feet of the sphere must make a Dexterity saving throw. The creature takes 2d6 fire damage on a failed save, or half as much damage on a successful one.

As a bonus action, you can move the sphere up to 30 feet. If you ram the sphere into a creature, that creature must make the saving throw against the sphere’s damage, and the sphere stops moving this turn.

When you move the sphere, you can direct it over barriers up to 5 feet tall and jump it across pits up to 10 feet wide. The sphere ignites flammable objects not being worn or carried, and it sheds bright light in a 20-foot radius and dim light for an additional 20 feet.&nbsp;
"""
''Berserk.'' Whenever the golem starts its turn with 40 hit points or fewer, roll a <<roll 1d6>>. On a 6, the golem goes berserk. On each of its turns while berserk, the golem attacks the nearest creature it can see. If no creature is near enough to move to and attack, the golem attacks an object, with preference for an object smaller than itself. Once the golem goes berserk, it continues to do so until it is destroyed or regains all its hit points.
The golem’s creator, if within <<range 60>> of the berserk golem, can try to calm it by speaking firmly and persuasively. The golem must be able to hear its creator, who must take an action to make a <<persuasion 15>>. If the check succeeds, the golem ceases being berserk. If it takes damage while still at 40 hit points or fewer, the golem might go berserk again.
''Aversion of Fire.'' If the golem takes fire damage, it has <<disadvantage>> on attack rolls and ability checks until the end of its next turn.
''Immutable Form.'' The golem is immune to any spell or effect that would alter its form.
''Lightning Absorption.'' Whenever the golem is subjected to lightning damage, it takes no damage and instead regains a number of hit points equal to the lightning damage dealt.
''Magic Resistance.'' The golem has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The golem’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The golem makes two slam attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +7>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
You attempt to turn one creature that you can see within range into stone.
If the targets body is made of flesh, the creature must make a Constitution saving throw. On a failed save, it is [[Restrained]] as its flesh begins to harden. On a successful save, the creature isn’t affected.

A creature [[Restrained]] by this spell must make another Constitution saving throw at the end of each of its turns. If it successfully saves against this spell three times, the spell ends. If it fails saves three times, it is turned to stone and subjected to the petrified condition for the duration. The successes and failures don’t need to be consecutive; keep track of both until the target collects three of a kind.

If the creature is physically broken while petrified, it suffers from similar deformities if it reverts to its original state. If you maintain your concentration on this spell for the entire possible duration, the creature is turned to stone until the effect is removed.
This spell creates a circular, horizontal plane of force, 3 feet in diameter and 1 inch thick, that floats 3 feet above the ground in an unoccupied space of your choice that you can see within range. The disk remains for the duration, and can hold up to 500 pounds. If more weight is placed on it, the spell ends, and everything on the disk falls to the ground.

The disk is immobile while you are within 20 feet of it. If you move more than 20 feet away from it, the disk follows you so that it remains within 20 feet of you. It can move across uneven terrain, up or down stairs, slopes and the like, but it can’t cross an elevation change of 10 feet or more. For example, the disk can’t move across a 10-foot-deep pit, nor could it leave such a pit if it was created at the bottom.

If you move more than 100 feet from the disk (typically because it can’t move around an obstacle to follow you), the spell ends.
Immediately after you take the Attack action on your turn, you can spend 1 [[Ki]] point to make two unarmed strikes as a bonus action.
You touch a willing creature. The target gains a flying speed of 60 feet for the duration. When the spell ends, the target falls if it is still aloft, unless it can stop the fall.
A monster that has a flying speed can use all or part of its movement to fly. Some monsters have the ability to hover, which makes them hard to knock out of the air (as explained in the rules on flying in the Player's Handbook). Such a monster stops hovering when it dies.
"""
''Flyby.'' The snake doesn’t provoke opportunity attacks when it flies out of an enemy’s reach.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1>> + <<poison 3d4>> |<<reach 5>> |
"""
''Antimagic Susceptibility.'' The sword is [[Incapacitated]] while in the area of an antimagic field. If targeted by [[Dispel Magic]], the sword must succeed on a <<save Con>> against the caster’s spell save DC or fall unconscious for <<time 1m>>.
''False Appearance.'' While the sword remains motionless and isn’t flying, it is indistinguishable from a normal sword.
"""
[img[divider.png]]

|max|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +3>>|<<slashing 1d8+1>> |<<reach 5>> |
"""
''Optional Class Feature''
"""

When you miss with an attack roll, you can spend 1 to 3 ki points to increase your attack roll by 2 for each of these ki points you spend, potentially turning the miss into a hit.
At 20th level, you become an unparalleled hunter of your enemies. Once on each of your turns, you can add your Wisdom modifier to the attack roll or the damage roll of an attack you make against one of your favored enemies. You can choose to use this feature before or after the roll, but before any effects of the roll are applied.
You create a 20-foot-radius sphere of fog centered on a point within range. The sphere spreads around corners, and its area is heavily obscured, It lasts for the duration or until a wind of moderate or greater speed (at least 10 miles per hour) disperses it.
\define fold(tiddler)
<$set name="controller" value="$:/state/$(currentTiddler)$/section/$tiddler$">

<div style="width: 100%">
<$reveal type="nomatch" state=<<controller>> text="open">
  <$button class="tc-btn-invisible" set=<<controller>> setTo="open">
    <span class="fold">&#707; <$transclude tiddler="$tiddler$" field="caption"><$view tiddler="$tiddler$" field="title" /></$transclude></span>
  </$button>
</$reveal><$reveal type="match" state=<<controller>> text="open">
  <$button class="tc-btn-invisible" set=<<controller>> setTo="close">
    <span class="unfold">&#709; <$transclude tiddler="$tiddler$" field="caption"><$view tiddler="$tiddler$" field="title" /></$transclude></span>
  </$button></$reveal><span style="float: right;">[[[ Open ]|$tiddler$]]</span></div>

<$reveal type="match" state=<<controller>> text="open">
<$transclude tiddler="$tiddler$" mode="block"/>

</$reveal>
</$set>
\end

---

&lt;&lt;''fold'' //tiddler//&gt;&gt;

<<fold "Kobold">>
<<fold "Kenku (Monster)">>
<<fold "Spell Scroll Mishap">>

This object appears as a wooden box that measures 12 inches long, 6 inches wide, and 6 inches deep. It weighs 4 pounds and floats. It can be opened to store items inside. This item also has three command words, each requiring you to use an action to speak it.

One command word causes the box to unfold into a boat 10 feet long, 4 feet wide, and 2 feet deep. The boat has one pair of oars, an anchor, a mast, and a lateen sail. The boat can hold up to four Medium creatures comfortably.

The second command word causes the box to unfold into a ship 24 feet long, 8 feet wide, and 6 feet deep. The ship has a deck, rowing seats, five sets of oars, a steering oar, an anchor, a deck cabin, and a mast with a square sail. The ship can hold fifteen Medium creatures comfortably.

When the box becomes a vessel, its weight becomes that of a normal vessel its size, and anything that was stored in the box remains in the boat.

The third command word causes the folding boat to fold back into a box, provided that no creatures are aboard. Any objects in the vessel that can’t fit inside the box remain outside the box as it folds. Any objects in the vessel that can fit inside the box do so.
Beginning when you reach 5th level, you regain all of your expended uses of Bardic Inspiration when you finish a short or long rest.
At 2nd level, you tap into a deep wellspring of magic within yourself. This wellspring is represented by sorcery points, which allow you to create a variety of magical effects.

!!! Sorcery Points

You have 2 sorcery points, and you gain more as you reach higher levels, as shown in the Sorcery Points column of the Sorcerer table. You can never have more sorcery points than shown on the table for your level. You regain all spent sorcery points when you finish a long rest.

!!! Flexible Casting

You can use your sorcery points to gain additional spell slots, or sacrifice spell slots to gain additional sorcery points. You learn other ways to use your sorcery points as you reach higher levels.

''Creating Spell Slots.'' You can transform unexpended sorcery points into one spell slot as a bonus action on your turn. The Creating Spell Slots table shows the cost of creating a spell slot of a given level. You can create spell slots no higher in level than 5th.

Any spell slot you create with this feature vanishes when you finish a long rest.

!!! Creating Spell Slots

{{Font of Magic Spell Slots Table}}

''Converting a Spell Slot to Sorcery Points.'' As a bonus action on your turn, you can expend one spell slot and gain a number of sorcery points equal to the slot’s level.
You create a ward against magical travel that protects up to 40,000 square feet of floor space to a height of 30 feet above the floor. For the duration, creatures can’t teleport into the area or use portals, such as those created by the gate spell, to enter the area. The spell proofs the area against planar travel, and therefore prevents creatures from accessing the area by way of the Astral Plane, Ethereal Plane, Feywild, Shadowfell, or the plane shift spell.

In addition, the spell damages types of creatures that you choose when you cast it. Choose one or more of the following: celestials, elementals, fey, fiends, and undead. When a chosen creature enters the spell’s area for the first time on a turn or starts its turn there, the creature takes 5d10 radiant or necrotic damage (your choice when you cast this spell).

When you cast this spell, you can designate a password. A creature that speaks the password as it enters the area takes no damage from the spell.

This spell’s area can’t overlap with the area of another forbiddance spell. If you cast forbiddance every day for 30 days in the same location, the spell lasts until it is dispelled, and the material components are consumed on the last casting.
An immobile, invisible, cube-shaped prison composed of magical force springs into existence around an area you choose within range. The prison can be a cage or a solid box, as you choose.

A prison in the shape of a cage can be up to 20 feet on a side and is made from 1/2-inch diameter bars spaced 1/2 inch apart.

A prison in the shape of a box can be up to 10 feet on a side, creating a solid barrier that prevents any matter from passing through it and blocking any spells cast into or out from the area.

When you cast the spell, any creature that is completely inside the cage's area is trapped. Creatures only partially within the area, or those too large to fit inside the area, are pushed away from the center of the area until they are completely outside the area.

A creature inside the cage can't leave it by nonmagical means. If the creature tries to use teleportation or interplanar travel to leave the cage, it must first make a Charisma saving throw. On a success, the creature can use that magic to exit the cage. On a failure, the creature can't exit the cage and wastes the use of the spell or effect. The cage also extends into the Ethereal Plane, blocking ethereal travel.

This spell can't be dispelled by [[Dispel Magic]].
You touch a willing creature and bestow a limited ability to see into the immediate future. For the duration, the target can’t be surprised and has advantage on attack rolls, ability checks, and saving throws. Additionally, other creatures have disadvantage on attack rolls against the target for the duration.
This spell immediately ends if you cast it again before its duration ends.
| !Druid Level | !Spells |
| !3rd |[[Barkskin]], [[Spider Climb]] |
| !5th |[[Call Lightning]], [[Plant Growth]] |
| !7th |[[Divination]], [[Freedom of Movement]] |
| !9th |[[Commune with Nature]], [[Tree Stride]] |
This small box contains a variety of papers and parchments, pens and inks, seals and sealing wax, gold and silver leaf, and other supplies necessary to create convincing forgeries of physical documents. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to create a physical forgery of a document.

A forgery kit is designed to duplicate documents and to make it easier to copy a person’s seal or signature.

''Components.'' A forgery kit includes:

* several different types of ink
* a variety of parchments and papers
* several quills
* seals and sealing wax
* gold and silver leaf
* small tools to sculpt melted wax to mimic a seal

''Arcana.'' A forgery kit can be used in conjunction with the Arcana skill to determine if a magic item is real or fake.

''Deception.'' A well-crafted forgery, such as papers proclaiming you to be a noble or a writ that grants you safe passage, can lend credence to a lie.

''History.'' A forgery kit combined with your knowledge of history improves your ability to create fake historical documents or to tell if an old document is authentic.

''Investigation.'' When you examine objects, proficiency with a forgery kit is useful for determining how an object was made and whether it is genuine.

''Other Tools.'' Knowledge of other tools makes your forgeries that much more believable. For example, you could combine proficiency with a forgery kit and proficiency with cartographer’s tools to make a fake map.

''Quick Fake.'' As part of a short rest, you can produce a forged document no more than one page in length. As part of a long rest, you can produce a document that is up to four pages long. Your Intelligence check using a forgery kit determines the DC for someone else’s Intelligence (Investigation) check to spot the fake.

| !Activity | !DC |
|!Mimic handwriting | 15 |
|!Duplicate a wax seal | 20 |
You touch a willing creature. For the duration, the target’s movement is unaffected by difficult terrain, and spells and other magical effects can neither reduce the target’s speed nor cause the target to be [[Paralyzed]] or [[Restrained]].

The target can also spend 5 feet of movement to automatically escape from nonmagical restraints, such as manacles or a creature that has it grappled. Finally, being underwater imposes no penalties on the target’s movement or attacks.
A frigid globe of cold energy streaks from your fingertips to a point of your choice within range, where it explodes in a 60-foot-radius sphere. Each creature within the area must make a Constitution saving throw. On a failed save, a creature takes 10d6 cold damage. On a successful save, it takes half as much damage.

If the globe strikes a body of water or a liquid that is principally water (not including water-based creatures), it freezes the liquid to a depth of 6 inches over an area 30 feet square. This ice lasts for 1 minute. Creatures that were swimming on the surface of frozen water are trapped in the ice. A trapped creature can use an action to make a Strength check against your spell save DC to break free.

You can refrain from firing the globe after completing the spell, if you wish. A small globe about the size of a sling stone, cool to the touch, appears in your hand. At any time, you or a creature you give the globe to can throw the globe (to a range of 40 feet) or hurl it with a sling (to the sling's normal range). It shatters on impact, with the same effect as the normal casting of the spell. You can also set the globe down without shattering it. After 1 minute, if the globe hasn't already shattered, it explodes.
Starting when you choose this path at 3rd level, you can go into a frenzy when you rage. If you do so, for the duration of your rage you can make a single melee weapon attack as a bonus action on each of your turns after this one. When your rage ends, you suffer one level of exhaustion.

* A frightened creature has disadvantage on ability checks and attack rolls while the source of its fear is within line of sight.
* The creature can't willingly move closer to the source of its fear.
"""
''Amphibious.'' The frog can breathe air and water.
''Standing Leap.'' The frog’s long jump is up to 10 feet and its high jump is up to 5 feet, with or without a running start.
"""
When you hit with an attack using this magic sword, the target takes an extra <<cold 1d6>>. In addition, while you hold the sword, you have resistance to <<fire fire>> damage.

In freezing temperatures, the blade sheds <<bright 10>> and an additional <<dim 10>>.

When you draw this weapon, you can extinguish all nonmagical flames within 30 feet of you. This property can be used no more than once per hour.
''Multiattack.'' The giant makes two greataxe attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greataxe +9>>|<<slashing 3d12+6>> |<<reach 10>> |
| !<<ranged Rock +9>>|<<bludgeoning 4d10+6>> |<<range 60/240>> |

Greataxe. Melee Weapon Attack: +9 to hit, reach 10 ft., one target. Hit: 25 (3d12 + 6) slashing damage.

Rock. Ranged Weapon Attack: +9 to hit, range 60/240 ft., one target. Hit: 28 (4d10 + 6) bludgeoning damage.
This item encompasses a wide range of game pieces, including dice and decks of cards (for games such as Three-Dragon Ante). A few common examples appear on the Tools table, but other kinds of gaming sets exist. If you are proficient with a gaming set, you can add your proficiency bonus to ability checks you make to play a game with that set. Each type of gaming set requires a separate proficiency.

Proficiency with a gaming set applies to one type of game, such as Three-Dragon Ante or games of chance that use dice.

''Components.'' A gaming set has all the pieces needed to play a specific game or type of game, such as a complete deck of cards or a board and tokens.

''History.'' Your mastery of a game includes knowledge of its history, as well as of important events it was connected to or prominent historical figures involved with it.

''Insight.'' Playing games with someone is a good way to gain understanding of their personality, granting you a better ability to discern their lies from their truths and read their mood.

''Sleight of Hand.'' Sleight of Hand is a useful skill for cheating at a game, as it allows you to swap pieces, palm cards, or alter a die roll. Alternatively, engrossing a target in a game by manipulating the components with dexterous movements is a great distraction for a pickpocketing attempt.

| !Activity | !DC |
|!Catch a player cheating | 15 |
|!Gain insight into an opponent’s personality | 15 |
"""
''False Appearance.'' While the gargoyle remains motionless, it is indistinguishable from an inanimate statue.
"""
<<divider>>
''Multiattack.'' The gargoyle makes two attacks: one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<melee Claws +4>>|<<slashing 1d6+2>> |<<reach 5>> |
You transform a willing creature you touch, along with everything it’s wearing and carrying, into a misty cloud for the duration. The spell ends if the creature drops to 0 hit points. An incorporeal creature isn’t affected.

While in this form, the target’s only method of movement is a flying speed of 10 feet. The target can enter and occupy the space of another creature. The target has resistance to nonmagical damage, and it has advantage on Strength, Dexterity, and Constitution saving throws. The target can pass through small holes, narrow openings, and even mere cracks, though it treats liquids as though they were solid surfaces. The target can’t fall and remains hovering in the air even when [[Stunned]] or otherwise [[Incapacitated]].

While in the form of a misty cloud, the target can’t talk or manipulate objects, and any objects it was carrying or holding can’t be dropped, used, or otherwise interacted with. The target can’t attack or cast spells.
You conjure a portal linking an unoccupied space you can see within range to a precise location on a different plane of existence. The portal is a circular opening, which you can make 5 to 20 feet in diameter. You can orient the portal in any direction you choose. The portal lasts for the duration.

The portal has a front and a back on each plane where it appears. Travel through the portal is possible only by moving through its front. Anything that does so is instantly transported to the other plane, appearing in the unoccupied space nearest to the portal.

Deities and other planar rulers can prevent portals created by this spell from opening in their presence or anywhere within their domains.

When you cast this spell, you can speak the name of a specific creature (a pseudonym, title, or nickname doesn't work). If that creature is on a plane other than the one you are on, the portal opens in the named creature's immediate vicinity and draws the creature through it to the nearest unoccupied space on your side of the portal. You gain no special power over the creature, and it is free to act as the GM deems appropriate. It might leave, attack you, or help you.
Your Strength score is 19 while you wear these gauntlets. They have no effect on you if your Strength is 19 or higher without them.
You can use your action to touch a willing humanoid and perceive through its senses until the end of your next turn. As long as the creature is on the same plane of existence as you, you can use your action on subsequent turns to maintain this connection, extending the duration until the end of your next turn. While perceiving through the other creature’s senses, you benefit from any special senses possessed by that creature, and you are blinded and deafened to your own surroundings.
You place a magical command on a creature that you can see within range, forcing it to carry out some service or refrain from some action or course of actiity as you decide.
If the creature can understand you, it must succeed on a Wisdom saving throw or become [[Charmed]] by you for the duration. While the creature is [[Charmed]] by you, it takes 5d10 psychic damage each time it acts in a manner directly counter to your instructions, but no more than once each day. A creature that can’t understand you is unaffected by the spell.

You can issue any command you choose, short of an activity that would result in certain death. Should you issue a suicidal command, the spell ends. You can end the spell early by using an action to dismiss it. A remove curse, greater restoration, or wish spell also ends it.&nbsp;
"""
''Ooze Cube.'' The cube takes up its entire space. Other creatures can enter the space, but a creature that does so is subjected to the cube’s Engulf and has disadvantage on the saving throw.

Creatures inside the cube can be seen but have [[Total Cover]].

A creature within 5 feet of the cube can take an action to pull a creature or object out of the cube. Doing so requires a successful <<skillcheck Str 12>>, and the creature making the attempt takes <<acid 3d6>>.

The cube can hold only one Large creature or up to four Medium or smaller creatures inside it at a time.
''Transparent.'' Even when the cube is in plain sight, it takes a successful <<perception 15>> to spot a cube that has neither moved nor attacked. A creature that tries to enter the cube’s space while unaware of the cube is [[Surprised]] by the cube.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pseudopod +4>>|<<acid 3d6>> |<<reach 5>> |
| !Engulf|The cube moves up to its speed. While doing so, it can enter Large or smaller creatures’ spaces. Whenever the cube enters a creature’s space, the creature must make a <<save Dex 12>>. <br/>&nbsp;<br/>On a successful save, the creature can choose to be pushed 5 feet back or to the side of the cube. A creature that chooses not to be pushed suffers the consequences of a failed saving throw.<br/>&nbsp;<br/>On a failed save, the cube enters the creature’s space, and the creature takes <<acid 3d6>> and is engulfed. The engulfed creature can’t breathe, is [[Restrained]], and takes <<acid 6d6>> at the start of each of the cube’s turns. When the cube moves, the engulfed creature moves with it.<br/>&nbsp;<br/>An engulfed creature can try to escape by taking an action to make a <<skillcheck Str 12>>. On a success, the creature escapes and enters a space of its choice within 5 feet of the cube. |<|
This prism has 50 charges. While you are holding it, you can use an action to speak one of three command words to cause one of the following effects:

* The first command word causes the gem to shed <<bright 30>> and an additional <<dim 30>>. This effect doesn’t expend a charge. It lasts until you use a bonus action to repeat the command word or until you use another function of the gem.
* The second command word expends 1 charge and causes the gem to fire a brilliant beam of light at one creature you can see within <<range 60>>. The creature must succeed on a <<save Con 15>> or become [[Blinded]] for <<time 1m>>. The creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success.
* The third command word expends 5 charges and causes the gem to flare with blinding light in a <<cone 30>> originating from it. Each creature in the cone must make a saving throw as if struck by the beam created with the second command word.

When all of the gem’s charges are expended, the gem becomes a nonmagical jewel worth 50 gp.
This gem has 3 charges. As an action, you can speak the gem’s command word and expend 1 charge. For the next <<time 10m>>, you have [[Truesight]] out to 120 feet when you peer through the gem.

The gem regains <<roll 1d3>> expended charges daily at dawn.
.shadow-box {
    width: 99%; 
    box-shadow: inset 1px 1px grey, 4px 4px 6px grey; 
    padding: 5px 5px;
}
You touch a corpse or other remains. For the duration, the target is protected from decay and can’t become undead.

The spell also effectively extends the time limit on raising the target from the dead, since days spent under the influence of this spell don’t count against the time limit of spells such as [[Raise Dead]].
"""
''Stench.'' Any creature that starts its turn within <<range 5>> of the ghast must succeed on a <<save Con 10>> or be [[Poisoned]] until the start of its next turn. On a successful saving throw, the creature is immune to the ghast’s Stench for <<time 24h>>.
''Turning Defiance.'' The ghast and any ghouls within 30 feet of it have advantage on saving throws against effects that turn undead.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 2d8+3>> |<<reach 5>> |
| !<<melee Claws +5>>|<<slashing 2d6+3>> |<<reach 5>> |
|~|If the target is a creature other than an undead, it must succeed on a <<save Con 10>> or be [[Paralyzed]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|

"""
''Ethereal Sight.'' The ghost can see 60 feet into the Ethereal Plane when it is on the Material Plane, and vice versa.
''Incorporeal Movement.'' The ghost can move through other creatures and objects as if they were <<difficult>>. It takes <<force 1d10>> if it ends its turn inside an object.
"""
[img[divider.png]]

|max|k
| !<<action>> Actions |<|<|
| !<<melee "Withering Touch" +5>>|<<necrotic 4d6+3>> |<<reach 5>> |
|^ !Etherealness|The ghost enters the Ethereal Plane from the Material Plane, or vice versa. It is visible on the Material Plane while it is in the Border Ethereal, and vice versa, yet it can't affect or be affected by anything on the other plane. |<|
|^ !Horrifying Visage|Each non-undead creature within 60 feet of the ghost that can see it must succeed on a <<save Wis 13>> or be [[Frightened]] for <<time 1m>>. If the save fails by 5 or more, the target also ages 1d4 x 10 years. A frightened target can repeat the saving throw at the end of each of its turns, ending the [[Frightened]] condition on itself on a success. If a target's saving throw is successful or the effect ends for it, the target is immune to this ghost's Horrifying Visage for the next 24 hours. The aging effect can be reversed with a greater restoration spell, but only within 24 hours of it occurring. |<|
|^ !Possession|One humanoid that the ghost can see within 5 feet of it must succeed on a <<save Cha 13>> or be possessed by the ghost; the ghost then disappears, and the target is incapacitated and loses control of its body.<br/>&nbsp;<br/>The ghost now controls the body but doesn't deprive the target of awareness. The ghost can't be targeted by any attack, spell, or other effect, except ones that [[Turn Undead]], and it retains its alignment, Intelligence, Wisdom, Charisma, and immunity to being [[Charmed]] and [[Frightened]]. It otherwise uses the possessed target's statistics, but doesn't gain access to the target's knowledge, class features, or proficiencies.<br/>&nbsp;<br/>The possession lasts until the body drops to 0 hit points, the ghost ends it as a bonus action, or the ghost is turned or forced out by an effect like the dispel evil and good spell. When the possession ends, the ghost reappears in an unoccupied space within 5 feet of the body. The target is immune to this ghost's Possession for 24 hours after succeeding on the saving throw or after the possession ends. |<|
''Prerequisite:'' 7th level

As an action, you gain the ability to see through solid objects to a range of 30 feet. Within that range, you have darkvision if you don’t already have it. This special sight lasts for 1 minute or until your concentration ends (as if you were concentrating on a spell). During that time, you perceive objects as ghostly, transparent images.

Once you use this invocation, you can’t use it again until you finish a short or long rest.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +2>>|<<piercing 2d6+2>> |<<reach 5>> |
| !<<melee Claws +4>>|<<slashing 2d4+2>> |<<reach 5>> |
|~|If the target is a creature other than an elf or undead, it must succeed on a <<save Con 10>> or be [[Paralyzed]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
Giants tower over humans and their kind. They are humanlike in shape, though some have multiple heads (ettins) or deformities (fomorians). The six varieties of true giant are hill giants, stone giants, frost giants, fire giants, cloud giants, and storm giants. Besides these,
creatures such as ogres and trolls are giants.

<<list-box "[tag[Giant]sort[]]" "No giants found.">>
''Multiattack.'' The ape makes two fist attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Fist +9>>|<<bludgeoning 3d10+6>> |<<reach 10>> |
| !<<ranged Rock +9>>|<<bludgeoning 7d6+6>> |<<range 50/100>> |
"""
''Keen Smell.'' The badger has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack.'' The badger makes two attacks: one with its bite and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d6+1>> |<<reach 5>> |
| !<<melee Claws +3>>|<<slashing 2d4+1>> |<<reach 5>> |
"""
''Echolocation.'' The bat can’t use its blindsight while deafened.
''Keen Hearing.'' The bat has advantage on Wisdom (Perception) checks that rely on hearing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
"""
''Charge.'' If the boar moves at least <<range 20>> straight toward a target and then hits it with a ''tusk attack'' on the same turn, the target takes an extra <<slashing 2d6>>. If the target is a creature, it must succeed on a <<save Str 13>> or be knocked [[Prone]].
''Relentless (Recharges after a Short or Long Rest).'' If the boar takes <<damage "&le;10">> that would reduce it to <<hp 0>>, it is reduced to <<hp 1>> instead.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Tusk +5>>|<<slashing 2d6+3>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d4+2>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 11>> or take <<poison 3d6>>. If the poison damage reduces the target to <<hp 0>>, the target is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and is [[Paralyzed]] while [[Poisoned]] in this way. |<|
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 2d6+4>> |<<reach 10>> |
| !<<melee Constrict +6>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 16>>). Until this grapple ends, the creature is [[Restrained]], and the snake can't constrict another target. |<|
"""
Amphibious. The crab can breathe air and water.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +3>>|<<bludgeoning 1d6+1>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 11>>). The crab has two claws, each of which can grapple only one target. |<|
"""
''Hold Breath.'' The crocodile can hold its breath for <<time 30m>>.
"""
<<divider>>
''Multiattack.'' The crocodile makes two attacks: one with its bite and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +8>>|<<piercing 3d10+5>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 16>>). Until this grapple ends, the target is [[Restrained]], and the crocodile can’t bite another target. |<|
| !<<melee Tail +8>>|<<bludgeoning 2d8+5>> |<<reach 10>><br/>Not [[Grappled]] by the crocodile |
|~|If the target is a creature, it must succeed on a <<save Str 16>> or be knocked [[Prone]]. |<|
"""
''Keen Sight.'' The eagle has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The eagle makes two attacks: one with its beak and one with its talons.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +5>>|<<piercing 1d6+3>> |<<reach 5>> |
| !<<melee Talons +5>>|<<slashing 2d6+3>> |<<reach 5>> |
"""
''Charge.'' If the elk moves at least 20 feet straight toward a target and then hits it with a ram attack on the same turn, the target takes an extra <<damage 2d6>>. If the target is a creature, it must succeed on a <<save Str 14>> or be knocked [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +6>>|<<bludgeoning 2d6+4>> |<<reach 10>> |
| !<<melee Hooves +6>>|<<bludgeoning 4d8+4>> |<<reach 5>> |
"""
''Illumination.'' The beetle sheds <<bright 10>> and an additional <<dim 10>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +1>>|<<slashing 1d6-1>> |<<reach 5>> |
"""
''Amphibious.'' The frog can breathe air and water.
''Standing Leap.'' The frog’s long jump is up to 20 feet and its high jump is up to 10 feet, with or without a running start.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d6+1>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 11>>). Until this grapple ends, the target is [[Restrained]], and the frog can’t bite another target. |<|
| !Swallow|The frog makes one bite attack against a Small or smaller target it is grappling. If the attack hits, the target is swallowed, and the grapple ends. The swallowed target is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the frog, and it takes <<acid 2d4>> at the start of each of the frog’s turns. The frog can have only one target swallowed at a time.<br/>&nbsp;<br/>If the frog dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse using 5 feet of movement, exiting [[Prone]]. |<|
"""
''Charge.'' If the goat moves at least 20 feet straight toward a target and then hits it with a ram attack on the same turn, the target takes an extra <<bludgeoning 2d4>>. If the target is a creature, it must succeed on a <<save Str 13>> or be knocked prone.
''Sure-Footed.'' The goat has advantage on Strength and Dexterity saving throws made against effects that would knock it [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +5>>|<<bludgeoning 2d4+3>> |<<reach 5>> |
"""
''Rampage.'' When the hyena reduces a creature to <<hp 0>> with a melee attack on its turn, the hyena can take a bonus action to move up to half its speed and make a bite attack.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 2d6+3>> |<<reach 5>> |
You transform up to ten centipedes, three spiders, five wasps, or one scorpion within range into giant versions of their natural forms for the duration. A centipede becomes a giant centipede, a spider becaomes a giant spider, a wasp becomes a giant wasp, and a scorpion becomes a giant scorpion.

Each creature obeys your verbal commands, and in combat, they act on your turn each round. The DM has the statistics for these creatures and resolves their actions and movement.

A creature remains in its giant size for the duration, until it drops to 0 hit points, or until you use an action to dismiss the effect on it.

The DM might allow you to choose different targets. For example, if you transform a bee, its giant version might have the same statistics as a giant wasp.
When a Large or larger creature within 5 feet of you hits or misses you with an attack, you can use your reaction to attack that creature immediately after its attack, provided that you can see the creature.
<<fold "Giant Lizard, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d8+2>> |<<reach 5>> |
Some giant lizards have one or both of the following traits.

"""
''Hold Breath.'' The lizard can hold its breath for <<time 15m>>. (A lizard that has this trait also has a swimming speed of 30 feet.)
''Spider Climb.'' The lizard can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
"""
"""
''Hold Breath.'' While out of water, the octopus can hold its breath for <<time 1h>>.
''Underwater Camouflage.'' The octopus has advantage on Dexterity (Stealth) checks made while underwater.
''Water Breathing.'' The octopus can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Tentacles +5>>|<<bludgeoning 2d6+3>> |<<reach 15>> |
|~|If target is a creature, it is [[Grappled]] (<<skillcheck Escape 16>>). Until this grapple ends, the target is [[Restrained]], and the octopus can't use its tentacles on another target. |<|
|^ !Ink Cloud|''Recharges after a Short or Long Rest''<br/>A <<sphere 20>> cloud of ink extends all around the octopus if it is underwater. The area is [[Heavily Obscured]] for <<time 1m>>, although a significant current can disperse the ink. After releasing the ink, the octopus can use the Dash action as a bonus action.  |<|
"""
''Flyby.'' The owl doesn’t provoke opportunity attacks when it flies out of an enemy’s reach.
''Keen Hearing and Sight.'' The owl has advantage on Wisdom (Perception) checks that rely on hearing or sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Talons +3>>|<<slashing 2d6+1>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1d4+4>> |<<reach 10>> |
|~|The target must make a <<save Con 11>>, taking <<poison 3d6>> on a failed save, or <<halved>> on a successful one. |<|
"""
''Keen Smell.'' The rat has advantage on Wisdom (Perception) checks that rely on smell.
''Pack Tactics.'' The rat has advantage on an attack roll against a creature if at least one of the rat’s allies is within 5 feet of the creature and the ally isn’t incapacitated.
"""
<<fold "Diseased Giant Rats, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d4+2>> |<<reach 5>> |
''Multiattack.'' The scorpion makes three attacks: two with its claws and one with its sting.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +4>>|<<bludgeoning 1d8+2>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 12>>). The scorpion has two claws, each of which can grapple only one target. |<|
| !<<melee Sting +4>>|<<piercing 1d10+2>> |<<reach 5>> |
|~|The target must make a <<save Con 12>>, taking <<poison 4d10>> on a failed save, or <<halved>> on a successful one. |<|
"""
''Charge.'' If the sea horse moves at least 20 feet straight toward a target and then hits it with a ram attack on the same turn, the target takes an extra <<bludgeoning 2d6>>. It the target is a creature, it must succeed on a <<save Str 11>> or be knocked [[Prone]].
''Water Breathing.'' The sea horse can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +3>>|<<bludgeoning 1d6+1>> |<<reach 5>> |
"""
''Blood Frenzy.'' The shark has advantage on melee attack rolls against any creature that doesn't have all its hit points.
''Water Breathing.''  The shark can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +9>>|<<piercing 3d10+6>> |<<reach 5>> |
You gain a +1 bonus to attack and damage rolls made with this magic weapon.

When you hit a giant with it, the giant takes an extra <<damage 2d6>> of the weapon’s type and must succeed on a <<save Str 15>> or fall [[Prone]]. For the purpose of this weapon, “giant” refers to any creature with the giant type, including <<mob Ettin>> and <<mob Troll>>.

''Applicable Weapons:'' Handaxe, Battleaxe, Greataxe, Greatsword, Longsword, Rapier, Scimitar, Shortsword
"""
''Spider Climb.'' The spider can climb difficult surfaces, including upside down on ceilings, without needing lo make an ability check.
''Web Sense.'' While in contact with a web, the spider knows the exact location of any other creature in contact with the same web.
''Web Walker.'' The spider ignores movement restrictions caused by webbing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +5>>|<<piercing 1d8+3>> |<<reach 5>> |
|~|The target must make a <<save Con 11>>, taking <<poison 2d8>> on a failed save, or <<halved>> on a successful one. If the poison damage reduces the target to 0 hit points, the target is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and is [[Paralyzed]] while poisoned in this way. |<|
|^ !<<ranged Web +5>>|&mdash; |<<range 30/60>> |
|~|On hit, the target is [[Restrained]] by webbing. As an <<action>>, the restrained target can make a <<save Str 12>>, bursting the webbing on a success. The webbing can also be attacked and destroyed (<<ac 10>>, <<hp 5>>; ''vulnerability'' to <<fire>>; ''immunity'' to <<bludgeoning bludgeoning>>, <<poison poison>>, and <<psychic psychic>>). |<|
"""
''Amphibious.'' The toad can breathe air and water.
''Standing Leap.'' The toad's long jump is up to 20 feet and its high jump is up to 10 feet, with or without a running start.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d10+2>> + <<poison 1d10>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 13>>). Until this grapple ends, the target is [[Restrained]], and the toad can't bite another target. |<|
| !Swallow|The toad makes one bite attack against a Medium or smaller target it is grappling. If the attack hits, the target is swallowed, and the grapple ends. The swallowed target is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the toad, and it takes <<acid 3d6>> at the start of each of the toad's turns. The toad can have only one target swallowed at a time.<br/>If the toad dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse using 5 feet of movement, exiting [[Prone]]. |<|
"""
''Keen Sight and Smell.'' The vulture has advantage on Wisdom (Perception) checks that rely on sight or smell.
''Pack Tactics.'' The vulture has advantage on an attack roll against a creature if at least one of the vulture's allies is within 5 feet of the creature and the ally isn't [[Incapacitated]].
"""
<<divider>>
''Multiattack.'' The vulture makes two attacks: one with its beak and one with its talons.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +4>>|<<piercing 2d4+2>> |<<reach 5>> |
| !<<melee Talons +4>>|<<slashing 2d6+2>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Sting +4>>|<<piercing 1d6+2>> |<<reach 5>> |
|~|The target must make a <<save Con 11>>, taking <fail><<poison 3d6>></fail>, or <pass><<halved>></pass>. If the poison damage reduces the target to <<hp 0>, the target is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and is [[Paralyzed]] while [[Poisoned]] in this way. |<|
"""
''Keen Hearing and Smell.'' The weasel has advantage on Wisdom (Perception) checks that rely on hearing or smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d4+3>> |<<reach 5>> |
"""
''Spider Climb.'' The spider can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Web Sense.'' While in contact with a web, the spider knows the exact location of any other creature in contact with the same web.
''Web Walker.'' The spider ignores movement restrictions caused by webbing.
"""
<<divider>>

|max|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +3>>|<<piercing 1d6+1>> |<<reach 5>> |
|~|The target must make a <<save Con 11>>, taking <<poison 2d6>> on a failed save, or <<halved>>  on a successful one. If the poison damage reduces the target to 0 hit points, the target is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and is [[Paralyzed]] while [[Poisoned]] in this way. |<|
"""
''Aberrant Ground.'' The ground in a <<circle 10>> around the mouther is doughlike <<difficult>>. Each creature that starts its turn in that area must succeed on a <<save Str 10>> or have its speed reduced to 0 until the start of its next turn.
''Gibbering.'' The mouther babbles incoherently while it can see any creature and isn’t [[Incapacitated]]. Each creature that starts its turn within <<sphere 20>> of the mouther and can hear the gibbering must succeed on a <<save Wis 10>>. On a failure, the creature can’t take <<reaction>> until the start of its next turn and <<roll 1d8>> to determine what it does during its turn. 
&nbsp;&nbsp;&nbsp;&nbsp;On a 1 to 4, the creature does nothing. 
&nbsp;&nbsp;&nbsp;&nbsp;On a 5 or 6, the creature takes no <<action>> or <<ba>> and uses all its movement to move in a randomly determined direction. 
&nbsp;&nbsp;&nbsp;&nbsp;On a 7 or 8, the creature makes a melee attack against a randomly determined creature within its reach or does nothing if it can’t make such an attack.
"""
<<divider>>
''Multiattack.'' The gibbering mouther makes one bite attack and, if it can, uses its Blinding Spittle.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +2>>|<<piercing 5d6>> |<<reach 5>> |
|~|If the target is Medium or smaller, it must succeed on a <<save Str 10>> or be knocked [[Prone]]. If the target is killed by this damage, it is absorbed into the mouther. |<|
| !Blinding Spittle|''Recharge 5–6''<br/>The mouther spits a chemical glob at a point it can see within <<range 15>> of it. The glob explodes in a blinding flash of light on impact. Each creature within <<sphere 5>> of the flash must succeed on a <<save Dex 13>> or be [[Blinded]] until the end of the mouther’s next turn. |<|

''Prerequisite:'' 5th level

You can breathe underwater, and you gain a swimming speed equal to your walking speed.

You can also cast water breathing once without expending a spell slot. You regain the ability to do so when you finish a long rest.

''Prerequisite:'' Pact of the Chain feature

Whenever you regain hit points while your familiar is within 100 feet of you, treat any dice rolled to determine the hit points you regain as having rolled their maximum value for you.

"""
''Prerequisite:'' 9th Level Warlock, Pact of the Tome Feature
"""

A new page appears in your Book of Shadows. With your permission, a creature can use its action to write its name on that page, which can contain a number of names equal to your proficiency bonus.

When any creature whose name is on the page is reduced to 0 hit points but not killed outright, the creature magically drops to 1 hit point instead. Once this magic is triggered, no creature can benefit from it until you finish a long rest.

As an action, you can magically erase a name on the page by touching it.
"""
''Innate Spellcasting.'' The glabrezu’s spellcasting ability is Intelligence, <<skillcheck "Save DC" 16>>. The glabrezu can innately cast the following spells, requiring no material components:
''At will:'' [[Darkness]], [[Detect Magic>>, [[Dispel Magic]]
''1/day each:'' [[Confusion]], [[Fly]], [[Power Word Stun]]
''Magic Resistance.'' The glabrezu has advantage on saving throws against spells and other magical effects.
"""
''Multiattack.'' The glabrezu makes four attacks: two with its pincers and two with its fists. Alternatively, it makes two attacks with its pincers and casts one spell.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pincer +9>>|<<bludgeoning 2d10+5>> |<<reach 10>> |
|~|If the target is a Medium or smaller creature, it is [[Grappled]], <<skillcheck "Escape DC" 15>>. The glabrezu has two pincers, each of which can grapple only one target. |<|
| !<<melee Fist +9>>|<<bludgeoning 2d4+2>> |<<reach 5>> |
"""
''Brave.'' The gladiator has advantage on saving throws against being [[Frightened]].
''Brute.'' A melee weapon deals one extra die of its damage when the gladiator hits with it (included in the attack).
"""
<<divider>>
''Multiattack.'' The gladiator makes three melee attacks or two ranged attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Spear +7>>|<<piercing 2d6+4>><br/><<piercing 2d8+4>> (''Two-handed'') |<<reach 5>><br/><<range 20/60>> |
| !<<melee "Shield Bash" +7>>|<<bludgeoning 2d4+4>> |<<reach 5>> |
|~|If the target is a Medium or smaller creature, it must succeed on a <<save Str 15>> or be knocked [[Prone]]. |<|
| !<<reaction>> Reactions |<|<|
| !Parry|The gladiator adds <<ac +3>> against one melee attack that would hit it. To do so, the gladiator must see the attacker and be wielding a melee weapon. |<|
While wearing this armor, you gain a +1 bonus to AC. You can also use a bonus action to speak the armor’s command word and cause the armor to assume the appearance of a normal set of clothing or some other kind of armor. You decide what it looks like, including color, style, and accessories, but the armor retains its normal bulk and weight. The illusory appearance lasts until you use this property again or remove the armor.
Someone who is proficient with glassblower’s tools has not only the ability to shape glass, but also specialized knowledge of the methods used to produce glass objects.

 You need a source of heat to work glass.

''Components.'' The tools include:

* a blowpipe
* a small marver
* blocks
* tweezers

''Arcana, History.'' Your knowledge of glassmaking techniques aids you when you examine glass objects, such as potion bottles or glass items found in a treasure hoard. For instance, you can study how a glass potion bottle has been changed by its contents to help determine a potion’s effects. (A potion might leave behind a residue, deform the glass, or stain it.)

''Investigation.'' When you study an area, your knowledge can aid you if the clues include broken glass or glass objects.

''Identify Weakness.'' With 1 minute of study, you can identify the weak points in a glass object. Any damage dealt to the object by striking a weak spot is doubled.

| !Activity | !DC |
|!Identify source of glass | 10 |
|!Determine what a glass object once held | 20 |
Until the spell ends, when you make a Charisma check, you can replace the number you roll with a 15. Additionally, no matter what you say, magic that would determine if you are telling the truth indicates that you are being truthful.
An immobile, faintly shimmering barrier springs into existence in a 10-foot radius around you and remains for the duration.

Any spell of 5th level or lower cast from outside the barrier can’t affect creatures or objects within it, even if the spell is cast using a higher level spell slot. Such a spell can target creatures and objects within the barrier, but the spell has no effect on them. Similarly, the area within the barrier is excluded from the areas affected by such spells.
These gloves seem to almost meld into your hands when you don them. When a ranged weapon attack hits you while you’re wearing them, you can use your reaction to reduce the damage by <<damage "1d10+your Dexterity modifier">>, provided that you have a free hand. If you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in that hand.
While wearing these gloves, climbing and swimming don’t cost you extra movement, and you gain a +5 bonus to Strength (Athletics) checks made to climb or swim.
When you cast this spell, you inscribe a glyph that harms other creatures, either upon a surface (such as a table or a section of floor or wall) or within an object that can be closed (such as a book, a scroll, or a treasure chest) to conceal the glyph.
If you choose a surface, the glyph can cover an area of the surface no larger than 10 feet in diameter. If you choose an object, that object must remain in its place; if the object is moved more than 10 feet from where you cast this spell, the glyph is broken, and the spell ends without being triggered.

The glyph is nearly invisible and requires a successful Intelligence (Investigation) check against your spell save DC to be found.

You decide what triggers the glyph when you cast the spell. For glyphs inscribed on a surface, the most typical triggers include touching or standing on the glyph, removing another object covering the glyph, approaching within a certain distance of the glyph, or manipulating the object on which the glyph is inscribed. For glyphs inscribed within an object, the most common triggers include opening that object, approaching within a certain distance of the object, or seeing or reading the glyph. Once a glyph is triggered, this spell ends.

You can further refine the trigger so the spell activates only under certain circumstances or according to physical characteristics (such as height or weight), creature kind (for example, the ward could be set to affect aberrations or drow), or alignment. You can also set conditions for creatures that don’t trigger the glyph, such as those who say a certain password.

When you inscribe the glyph, choose explosive runes or a spell glyph.

<b>Explosive Runes</b>
When triggered, the glyph erupts with magical energy in a 20-foot-radius sphere centered on the glyph. The sphere spreads around corners. Each creature in the area must make a Dexterity saving throw. A creature takes 5d8 acid, cold, fire, lightning, or thunder damage on a failed saving throw (your choice when you create the glyph), or half as much damage on a successful one.

<b>Spell Glyph</b>
You can store a prepared spell of 3rd level or lower in the glyph by casting it as part of creating the glyph. The spell must target a single creature or an area. The spell being stored has no immediate effect when cast in this way. When the glyph is triggered, the stored spell is cast. If the spell has a target, it targets the creature that triggered the glyph. If the spell affects an area, the area is centered on that creature. If the spell summons hostile creatures or creates harmful objects or traps, they appear as close as possible to the intruder and attack it. If the spell requires concentration, it lasts until the end of its full duration.<p></p><p></p>
''Rampage.'' When the gnoll reduces a creature to <<hp 0>> with a melee attack on its turn, the gnoll can take a <<ba>> to move up to half its speed and make a ''bite attack''.
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d4+2>> |<<reach 5>> |
| !<<melee Spear +4>>|<<piercing 1d6+2>><br/><<piercing 1d8+2>> (''two-handed'') |<<reach 5>><br/><<range 20/60>> |
| !<<ranged Longbow +3>>|<<piercing 1d8+3>> |<<range 150/600>> |
!! Gnome Traits

Your gnome character has certain characteristics in common with all other gnomes.

|^!Age |^Gnomes mature at the same rate humans do, and most are expected to settle down into an adult life by around age 40. They can live 350 to almost 500 years. |
|^!Alignment |^Gnomes are most often good. Those who tend toward law are sages, engineers, researchers, scholars, investigators, or inventors. Those who tend toward chaos are minstrels, tricksters, wanderers, or fanciful jewelers. Gnomes are good-hearted, and even the tricksters among them are more playful than vicious. |
|^!Size |^Gnomes are between 3 and 4 feet tall and average about 40 pounds. Your size is Small. |
|^!Speed |^Your base walking speed is 25 feet. |
|^!Darkvision |^Accustomed to life underground, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common and Gnomish. The Gnomish language, which uses the Dwarvish script, is renowned for its technical treatises and its catalogs of knowledge about the natural world. |
|^!Ability Score Increase |^Your Intelligence score increases by 2. |
|^![[Gnome Cunning]] |^{{Gnome Cunning}} |

<<subraces Gnome>>
You have advantage on all Intelligence, Wisdom, and Charisma saving throws against magic.
"""
''Charge.'' If the goat moves at least 20 feet straight toward a target and then hits it with a ram attack on the same turn, the target takes an extra <<bludgeoning 1d4>>. If the target is a creature, it must succeed on a <<save Str 10>> or be knocked [[Prone]].
''Sure-Footed.'' The goat has advantage on Strength and Dexterity saving throws made against effects that would knock it [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +3>>|<<bludgeoning 1d4+1>> |<<reach 5>> |
"""
''Nimble Escape.'' The goblin can take the ''Disengage'' or ''Hide'' action as a ''bonus action'' on each of its turns 
"""
[img[divider.png]]

|max|k
| !<<action>> Actions |<|<|
| !<<melee Scimitar +4>>|<<slashing 1d6+2>> |<<reach 5>> |
| !<<ranged Shortbow +4>>|<<piercing 1d6+2>> |<<range 80/320>> |
While wearing these dark lenses, you have darkvision out to a range of 60 feet. If you already have darkvision, wearing the goggles increases its range by 60 feet.
Up to ten berries appear in your hand and are infused with magic for the duration. A creature can use its action to eat one berry. Eating a berry restores 1 hit point, and the berry provides enough nourishment to sustain a creature for one day.
The berries lose their potency if they have not been consumed within 24 hours of the casting of this spell.
"""
''Trampling Charge.'' If the gorgon moves at least 20 feet straight toward a creature and then hits it with a gore attack on the same turn, that target must succeed on a <<save Str 16>> or be knocked [[Prone]]. If the target is [[Prone]], the gorgon can make one attack with its hooves against it as a <<ba>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Gore +8>>|<<piercing 2d12+5>> |<<reach 5>> |
| !<<melee Hooves +8>>|<<bludgeoning 2d10+5>> |<<reach 5>> |
| !Petrifying Breath|''Recharge 5–6''<br/>The gorgon exhales petrifying gas in a <<cone 30>>. Each creature in that area must succeed on a <<save Con 13>>. On a failed save, a target begins to turn to stone and is [[Restrained]]. The [[Restrained]] target must repeat the saving throw at the end of its next turn. On a success, the effect ends on the target. On a failure, the target is [[Petrified]] until freed by the [[Greater Restoration]] spell or other magic. |<|
* A grappled creature's speed becomes 0, and it can't benefit from any bonus to its speed.
* The condition ends if the grappler is [[Incapacitated]] (see the condition).
* The condition also ends if an effect removes the grappled creature from the reach of the grappler or grappling effect, such as when a creature is hurled away by the [[Thunderwave]] spell.
''Prerequisite:'' Strength 13 or higher

You’ve developed the skills necessary to hold your own in close-quarters grappling. You gain the following benefits:

* You have advantage on attack rolls against a creature you are grappling.
* You can use your action to try to pin a creature grappled by you. To do so, make another grapple check. If you succeed, you and the creature are both [[Restrained]] until the grapple ends.
When you want to grab a creature or wrestle with it, you can use the Attack action to make a special melee attack, a grapple. ''If you're able to make multiple attacks with the Attack action, this attack replaces one of them''.

The target of your grapple must be no more than one size larger than you, and it must be within your reach. Using at least one free hand, you try to seize the target by making a grapple check, a ''Strength (Athletics) check contested by the target's Strength (Athletics) or Dexterity (Acrobatics) check (the target chooses the ability to use)''. If you succeed, you subject the target to the grappled condition (see appendix A). The condition specifies the things that end it, and you can release the target whenever you like (no action required). 

''Escaping a Grapple.'' A grappled creature can use its action to escape. To do so, it must succeed on a Strength (Athletics) or Dexterity (Acrobatics) check contested by your Strength (Athletics) check.

''Moving a Grappled Creature.'' When you move, you can drag or carry the grappled creature with you, but your speed is halved, unless the creature is two or more sizes smaller than you.
''Prerequisite:'' Eldritch Blast Cantrip

Once on each of your turns when you hit a creature with your eldritch blast, you can move that creature in a straight line 10 feet closer to you.

| !Druid Level | !Spells |
| !3rd |[[Invisibility]], [[Pass Without Trace]] |
| !5th |[[Daylight]], [[Haste]] |
| !7th |[[Divination]], [[Freedom of Movement]] |
| !9th |[[Dream]], [[Insect Plague]] |
"""
''Amorphous.'' The ooze can move through a space as narrow as 1 inch wide without squeezing.
''Corrode Metal.'' Any nonmagical weapon made of metal that hits the ooze corrodes. After dealing damage, the weapon takes a permanent and cumulative −1 penalty to damage rolls. If its penalty drops to −5, the weapon is destroyed. Nonmagical ammunition made of metal that hits the ooze is destroyed after dealing damage.

The ooze can eat through 2-inch-thick, nonmagical metal in 1 round.
''False Appearance.'' While the ooze remains motionless, it is indistinguishable from an oily pool or wet rock.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pseudopod +3>>|<<bludgeoning 1d6+1>> + <<acid 2d6>> |<<reach 5>> |
|~|If the target is wearing nonmagical metal armor, its armor is partly corroded and takes a permanent and cumulative −1 penalty to the AC it offers. The armor is destroyed if the penalty reduces its <<ac 10>> |<|
Slick grease covers the ground in a 10-foot square centered on a point within range and turns it into difficult terrain for the duration.

When the grease appears, each creature standing in its area must succeed on a Dexterity saving throw or fall prone. A creature that enters the area or ends its turn there must also succeed on a Dexterity saving throw or fall prone.
When you roll a 1 or 2 on a damage die for an attack you make with a melee weapon that you are wielding with two hands, you can reroll the die and must use the new roll, even if the new roll is a 1 or a 2. The weapon must have the two-handed or versatile property for you to gain this benefit.
You or a creature you touch becomes invisible until the spell ends. Anything the target is wearing or carrying is invisible as long as it is on the target&#8217;s person.
You imbue a creature you touch with positive energy to undo a debilitating effect. You can reduce the target’s exhaustion level by one, or end one of the following effects on the target: 

* One effect that [[Charmed]] or [[Petrified]] the target 
* One curse, including the target’s attunement to a cursed magic item 
* Any reduction to one of the target’s ability scores 
* One effect reducing the target’s hit point maximum
"""
''Amphibious.'' The hag can breathe air and water.
''Innate Spellcasting.'' The hag’s innate spellcasting ability is Charisma (<<save "Spell DC" 12>>). She can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Dancing Lights]], [[Minor Illusion]], [[Vicious Mockery]]
''Mimicry.'' The hag can mimic animal sounds and humanoid voices. A creature that hears the sounds can tell they are imitations with a successful <<insight 14>>.
"""
{{Hag Shared Spellcasting}}
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +6>>|<<slashing 2d8+4>> |<<reach 5>> |
| !Illusory Appearance|The hag covers herself and anything she is wearing or carrying with a magical illusion that makes her look like another creature of her general size and humanoid shape. The illusion ends if the hag takes a <<ba>> to end it or if she dies.<br/>The changes wrought by this effect fail to hold up to physical inspection. For example, the hag could appear to have smooth skin, but someone touching her would feel her rough flesh. Otherwise, a creature must take an action to visually inspect the illusion and succeed on a <<investigation 20>> to discern that the hag is disguised. |<|
| !Invisible Passage|The hag magically turns invisible until she attacks or casts a spell, or until her concentration ends (as if concentrating on a spell). While invisible, she leaves no physical evidence of her passage, so she can be tracked only by magic. Any equipment she wears or carries is invisible with her. |<|
"""
''Stone Camouflage.'' The grick has advantage on Dexterity (Stealth) checks made to hide in rocky terrain.
"""
[img[divider.png]]
''Multiattack.'' The grick makes one attack with its tentacles. If that attack hits, the grick can make one beak attack against the same target.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Tentacles +4>>|<<slashing 2d6+2>> |<<reach 5>> |
| !<<melee Beak +4>>|<<piercing 1d6+2>> |<<reach 5>> |
"""
''Keen Sight.'' The griffon has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The griffon makes two attacks: one with its beak and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +6>>|<<piercing 1d8+4>> |<<reach 5>> |
| !<<melee Claw +6>>|<<slashing 2d6+4>> |<reach 5>> |
"""
''Blind Senses.'' The grimlock can’t use its blindsight while deafened and unable to smell.
''Keen Hearing and Smell.'' The grimlock has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Stone Camouflage.'' The grimlock has advantage on Dexterity (Stealth) checks made to hide in rocky terrain.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Spiked Bone Club" +5>>|<<bludgeoning 1d4+3>>+<<piercing 1d4>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Spear +3>>|<<piercing 1d6+1>> |<<reach 5>><br/><<range 20/60>> |
"""
''Rejuvenation.'' If it dies, the naga returns to life in <<time "1d6 days">> and regains all its hit points. Only a [[Wish]] spell can prevent this trait from functioning.
''Spellcasting.'' The naga is an 11th-level spellcaster. Its spellcasting ability is Wisdom (<<save "Spell DC" 16>>, <<casted +8>>), and it needs only verbal components to cast its spells. It has the following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Mending]], [[Sacred Flame]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Command]], [[Cure Wounds]], [[Shield of Faith]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Calm Emotions]], [[Hold Person]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Bestow Curse]], [[Clairvoyance]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Banishment]], [[Freedom of Movement]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (2 slots):'' [[Flame Strike]], [[Geas]]
&nbsp;&nbsp;&nbsp;&nbsp;''6th level (1 slot):'' [[True Seeing]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +8>>|<<piercing 1d8+4>> |<<reach 10>> |
|~|Target must make a <<save Con 15>>, taking <fail><<poison 10d8>></fail>, <pass><<halved>></pass>. |<|
| !<<ranged "Spit Poison" +8>>|&mdash; |<<range 15/30>> |
|~|The target must make a <<save Con 15>>, taking <fail><<poison 10d8>></fail>, <pass><<halved>></pass>. |<|
A Large spectral guardian appears and hovers for the duration in an unoccupied space of your choice that you can see within range. The guardian occupies that space and is indistinct except for a gleaming sword and shield emblazoned with the symbol of your deity.

Any creature hostile to you that moves to a space within 10 feet of the guardian for the firs time on a turn must succeed on a Dexterity saving throw. The creature takes 20 radiant damage on a failed save, or half as much damage on a successful one. The guardian vanishes when it has dealt a total of 60 damage.
You create a ward that protects up to 2,500 square feet of floor space (an area 50 feet square, or one hundred 5-foot squares or twenty-five 10-foot squares). The warded area can be up to 20 feet tall, and shaped as you desire. You can ward several stories of a stronghold by dividing the area among them, as long as you can walk into each contiguous area while you are casting the spell.

When you cast this spell, you can specify individuals that are unaffected by any or all of the effects that you choose. You can also specify a password that, when spoken aloud, makes the speaker immune to these effects.

Guards and wards creates the following effects within the warded area.

<b>Corridors</b>
Fog fills all the warded corridors, making them heavily obscured. In addition, at each intersection or branching passage offering a choice of direction, there is a 50 percent chance that a creature other than you will believe it is going in the opposite direction from the one it chooses.

<b>Doors</b>
All doors in the warded area are magically locked, as if sealed by an arcane lock spell. In addition, you can cover up to ten doors with an illusion (equivalent to the illusory object function of the m inor illusion spell) to make them appear as plain sections of wall.

<b>Stairs
</b>Webs fill all stairs in the warded area from top to bottom, as the web spell. These strands regrow in 10 minutes if they are burned or torn away while guards and wards lasts.

<b>Other Spell Effect</b>
You can place your choice of one of the following magical effects within the warded area of the stronghold.
• Place dancing lights in four corridors. You can designate&nbsp;a simple program that the lights repeat as long as
guards and wards lasts.
• Place magic mouth in two locations.
• Place stinking cloud in two locations. The vapors&nbsp;appear in the places you designate; they return within&nbsp;10 minutes if dispersed by wind while guards and&nbsp;wards lasts.
• Place a constant gust of wind in one corridor or room.
• Place a suggestion in one location. You select an area&nbsp;of up to 5 feet square, and any creature that enters
or passes through the area receives the suggestion&nbsp;mentally.

The whole warded area radiates magic. A dispel&nbsp;magic cast on a specific effect, if successful, removes&nbsp;only that effect.
You can create a permanently guarded and warded&nbsp;structure by casting this spell there every day&nbsp;for one year.
You touch one willing creature. Once before the spell ends, the target can roll a d4 and add the number rolled to one ability check of its choice. It can roll the die before or after making the ability check. The spell then ends.
A flash of light streaks toward a creature of your choice within range.
Make a ranged spell attack against the target. On a hit, the target takes 4d6 radiant damage, and the next attack roll made against this target before the end of your next turn has advantage, thanks to the mystical dim light glittering on the target until then.&nbsp;
A line of strong wind 60 feet long and 10 feet wide blasts from you in a direction you choose for the spell’s duration. Each creature that starts its turn in the line must succeed on a Strength saving throw or be pushed 15 feet away from you in a direction following the line.

Any creature in the line must spend 2 feet of movement for every 1 foot it moves when moving closer to you.

The gust disperses gas or vapor, and it extinguishes candles, torches, and similar unprotected flames in the area. It causes protected flames, such as those of lanterns, to dance wildly and has a 50 percent chance to extinguish them.

As a bonus action on each of your turns before the spell ends, you can change the direction in which the line blasts from you.
"""
''Inscrutable.'' The sphinx is immune to any effect that would sense its emotions or read its thoughts, as well as any divination spell that it refuses. Wisdom (Insight) checks made to ascertain the sphinx’s intentions or sincerity have disadvantage.
''Magic Weapons.'' The sphinx’s weapon attacks are magical.
''Spellcasting.'' The sphinx is a 9th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 16>>, <<casted "Spell Attack" +8>>). It requires no material components to cast its spells. The sphinx has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Mage Hand]], [[Minor Illusion]], [[Prestidigitation]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Detect Magic]], [[Identify]], [[Shield]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Darkness]], [[Locate Object]], [[Suggestion]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Dispel Magic]], [[Remove Curse]], [[Tongues]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Banishment]], [[Greater Invisibility]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (1 slot):'' [[Legend Lore]]
"""
<<divider>>
''Multiattack.'' The sphinx makes two claw attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +8>>|<<slashing 2d8+4>> |<<reach 5>>|
| !<<action>> Legendary Actions (3/Round) |<|<|
| !Claw Attack|The sphinx makes one claw attack. |<|
| !Teleport|''Costs 2 Actions.''<br/>The sphinx magically teleports, along with any equipment it is wearing or carrying, up to 120 feet to an unoccupied space it can see. |<|
| !Cast a Spell|''Costs 3 Actions.''<br/>The sphinx casts a spell from its list of prepared spells, using a spell slot as normal. |<|
| !<<action>> Lair Actions @ Initiative 20 |<|<|
|The flow of time is altered such that every creature in the lair must reroll initiative. The sphinx can choose not to reroll. |<|<|
|The effects of time are altered such that every creature in the lair must succeed on a <<save Con 15>> or become <<time "1d20 years">> older or younger (the sphinx’s choice), but never any younger than 1 year old. A [[Greater Restoration]] spell can restore a creature’s age to normal. |<|<|
|The flow of time within the lair is altered such that everything within moves up to 10 years forward or backward (sphinx’s choice). Only the sphinx is immediately aware of the time change. A [[Wish]] spell can return the caster and up to seven other creatures designated by the caster to their normal time. |<|<|
|The sphinx shifts itself and up to seven other creatures it can see within in its lair to another plane of existence. Once outside its lair, the sphinx can’t use lair actions, but it can return to its lair as a bonus action on its turn, taking up to seven creatures with it. |<|<|
''A target with half cover has a +2 bonus to AC and Dexterity saving throws''. A target has half cover if an obstacle blocks at least half of its body. The obstacle might be a low wall, a large piece of furniture, a narrow tree trunk, or a creature, whether that creature is an enemy or a friend. 
!! Half-Elf Traits

Your half-elf character has some qualities in common with elves and some that are unique to half-elves.

|^!Age |^Half-elves mature at the same rate humans do and reach adulthood around the age of 20. They live much longer than humans, however, often exceeding 180 years. |
|^!Alignment |^Half-elves share the chaotic bent of their elven heritage. They value both personal freedom and creative expression, demonstrating neither love of leaders nor desire for followers. They chafe at rules, resent others’ demands, and sometimes prove unreliable, or at least unpredictable. |
|^!Size |^Half-elves are about the same size as humans, ranging from 5 to 6 feet tall. Your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Darkvision |^Thanks to your elf blood, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common, Elvish, and one extra language of your choice. |
|^!Ability Score Increase |^Your Charisma score increases by 2, and two other ability scores of your choice increase by 1. |
|^![[Fey Ancestry]] |^{{Fey Ancestry}} |
|^![[Skill Versatility]] |^{{Skill Versatility}} |

<<subraces Half-Elf>>
!! Half-Orc Traits

Your half-orc character has certain traits deriving from your orc ancestry.

|^!Age |^Half-orcs mature a little faster than humans, reaching adulthood around age 14. They age noticeably faster and rarely live longer than 75 years. |
|^!Alignment |^Half-orcs inherit a tendency toward chaos from their orc parents and are not strongly inclined toward good. Half-orcs raised among orcs and willing to live out their lives among them are usually evil. |
|^!Size |^Half-orcs are somewhat larger and bulkier than humans, and they range from 5 to well over 6 feet tall. Your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Darkvision |^Thanks to your orc blood, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common and Orc. Orc is a harsh, grating language with hard consonants. It has no script of its own but is written in the Dwarvish script. |
|^!Ability Score Increase |^Your Strength score increases by 2, and your Constitution score increases by 1. |
|^![[Menacing]] |^{{Menacing}} |
|^![[Relentless Endurance]] |^{{Relentless Endurance}} |
|^![[Savage Attacks]] |^{{Savage Attacks}} |

<<subraces "Half-Orc">>
!! Halfling Traits

Your halfling character has a number of traits in common with all other halflings.

|^!Age |^A halfling reaches adulthood at the age of 20 and generally lives into the middle of his or her second century. |
|^!Alignment |^Most halflings are lawful good. As a rule, they are good-hearted and kind, hate to see others in pain, and have no tolerance for oppression. They are also very orderly and traditional, leaning heavily on the support of their community and the comfort of their old ways. |
|^!Size |^Halflings average about 3 feet tall and weigh about 40 pounds. Your size is Small. |
|^!Speed |^Your base walking speed is 25 feet. |
|^!Languages |^You can speak, read, and write Common and Halfling. The Halfling language isn’t secret, but halflings are loath to share it with others. They write very little, so they don’t have a rich body of literature. Their oral tradition, however, is very strong. Almost all halflings speak Common to converse with the people in whose lands they dwell or through which they are traveling. |
|^!Ability Score Increase |^Your Dexterity score increases by 2. |
|^![[Lucky|Halfling Lucky]] |^{{Halfling Lucky}} |
|^![[Brave]] |^{{Brave}} |
|^![[Halfling Nimbleness]] |^{{Halfling Nimbleness}} |

<<subraces Halfling>>
When you roll a 1 on the d20 for an attack roll, ability check, or saving throw, you can reroll the die and must use the new roll.
You can move through the space of any creature that is of a size larger than yours.
You touch a point and infuse an area around it with holy (or unholy) power. The area can have a radius up to 60 feet, and the spell fails if the radius includes an area already under the effect a hallow spell. The affected area is subject to the following effects.

First, celestials, elementals, fey, fiends, and undead can’t enter the area, nor can such creatures charm, frighten, or possess creatures within it. Any creature [[Charmed]], [[Frightened]], or possessed by such a creature is no longer [[Charmed]], [[Frightened]], or possessed upon entering the area. You can exclude one or more of those types of creatures from this effect.

Second, you can bind an extra effect to the area. Choose the effect from the following list, or choose an effect offered by the DM. Som e of these effects apply to creatures in the area; you can designate whether the effect applies to all creatures, creatures that follow a specific deity or leader, or creatures of a specific sort, such as ores or trolls. When a creature that would be affected enters the spell’s area for the first time on a turn or starts its turn there, it can make a Charisma saving throw. On a success, the creature ignores the extra effect until it leaves the area.

''Courage.'' Affected creatures can’t be frightened while in the area. 

''Darkness.'' Darkness fills the area. Normal light, as well as magical light created by spells of a lower level than the slot you used to cast this spell, can’t illuminate the area.

''Daylight.'' Bright light fills the area. Magical darkness created by spells of a lower level than the slot you used to cast this spell can’t extinguish the light.

''Energy Protection.'' Affected creatures in the area have resistance to one damage type of your choice, except for bludgeoning, piercing, or slashing.

''Energy Vulnerability.'' Affected creatures in the area have vulnerability to one damage type of your choice, except for bludgeoning, piercing, or slashing.

''Everlasting Rest.'' Dead bodies interred in the area can’t be turned into undead.

''Extradimensional Interference.'' Affected creatures can’t move or travel using teleportation or by extradimensional or interplanar means.

''Fear.'' Affected creatures are frightened while in the area.

''Silence.'' No sound can emanate from within the area, and no sound can reach into it.

''Tongues.'' Affected creatures can communicate with any other creature in the area, even if they don’t share a common language.
You make natural terrain in a 150-foot cube in range look, sound, and smell like some other sort of natural terrain. Thus, open fields or a road can be made to resemble a swamp, hill, crevasse, or some other difficult or impassable terrain. A pond can be made to seem like a grassy meadow, a precipice like a gentle slope, or a rock-strewn gully like a wide and smooth road. Manufactured structures, equipment, and creatures within the area aren’t changed in appearance.

The tactile characteristics of the terrain are unchanged, so creatures entering the area are likely to see through the illusion. If the difference isn’t obvious by touch, a creature carefully examining the illusion can attempt an Intelligence (Investigation) check against your spell save DC to disbelieve it. A creature who discerns the illusion for what it is, sees it as a vague image superimposed on the terrain.
You gain a +1 bonus to attack and damage rolls made with this magic weapon.

''Giant’s Bane (Requires Attunement).'' You must be wearing a [[Belt of Giant Strength]] (any variety) and [[Gauntlets of Ogre Power]] to attune to this weapon. The attunement ends if you take off either of those items. While you are attuned to this weapon and holding it, your Strength score increases by 4 and can exceed 20, but not 30. When you roll a 20 on an attack roll made with this weapon against a giant, the giant must succeed on a <<save Con 17>> or die.

The hammer also has 5 charges. While attuned to it, you can expend 1 charge and make a ranged weapon attack with the hammer, hurling it as if it had the thrown property with <<range 20/60>>. If the attack hits, the hammer unleashes a thunderclap audible out to 300 feet. The target and every creature within 30 feet of it must succeed on a <<save Con 17>> or be [[Stunned]] until the end of your next turn. The hammer regains 1d4 + 1 expended charges daily at dawn.
This backpack has a central pouch and two side pouches, each of which is an extradimensional space. Each side pouch can hold up to 20 pounds of material, not exceeding a volume of 2 cubic feet. The large central pouch can hold up to 8 cubic feet or 80 pounds of material. The backpack always weighs 5 pounds, regardless of its contents.

Placing an object in the haversack follows the normal rules for interacting with objects. Retrieving an item from the haversack requires you to use an action. When you reach into the haversack for a specific item, the item is always magically on top.

The haversack has a few limitations. If it is overloaded, or if a sharp object pierces it or tears it, the haversack ruptures and is destroyed. If the haversack is destroyed, its contents are lost forever, although an artifact always turns up again somewhere. If the haversack is turned inside out, its contents spill forth, unharmed, and the haversack must be put right before it can be used again. If a breathing creature is placed within the haversack, the creature can survive for up to <<time 10m>>, after which time it begins to suffocate.

Placing the haversack inside an extradimensional space created by a [[Bag of Holding]], [[Portable Hole]], or similar item instantly destroys both items and opens a gate to the Astral Plane. The gate originates where the one item was placed inside the other. Any creature within 10 feet of the gate is sucked through it and deposited in a random location on the Astral Plane. The gate then closes. The gate is one-way only and can’t be reopened.
You unleash a virulent disease on a creature that you can see within range.
The target must make a Constitution saving throw. On a failed save, it takes 14d6 necrotic damage, or half as much damage on a successful save. The damage can’t reduce the target’s hit points below 1. If the target fails the saving throw, its hit point maximum is reduced for 1 hour by an amount equal to the necrotic damage it took. Any effect that removes a disease allows a creature’s hit point maximum to return to normal before that time passes.
"""
''Optional Class Feature''
"""

You can expend a use of your Channel Divinity to fuel your spells. As a bonus action, you touch your holy symbol, utter a prayer, and regain one expended spell slot, the level of which can be no higher than half your proficiency bonus (rounded up). The number of times you can use this feature is based on the level you’ve reached in this class: 2nd level, once; 6th level, twice; and 18th level, thrice. You regain all expended uses when you finish a long rest.
''Multiattack.''The harpy makes two attacks: one with its claws and one with its club.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +3>>|<<slashing 2d4+1>> |<<reach 5>> |
| !<<melee Club +3>>|<<bludgeoning 1d4+1>> |<<reach 5>> |
| !Luring Song|The harpy sings a magical melody. Every humanoid and giant within 300 feet of the harpy that can hear the song must succeed on a <<save Wis 11>> saving throw or be [[Charmed]] until the song ends. The harpy must take a <<ba>> on its subsequent turns to continue singing. It can stop singing at any time. The song ends if the harpy is [[Incapacitated]].<br/>&nbsp;<br/>While [[Charmed]] by the harpy, a target is [[Incapacitated]] and ignores the songs of other harpies. If the [[Charmed]] target is more than 5 feet away from the harpy, the target can take the Dash action on its turn to move toward the harpy by the most direct route. It doesn't avoid opportunity attacks, but before moving into damaging terrain, such as lava or a pit, and whenever it takes damage from a source other than the harpy, a target can repeat the saving throw. A creature can also repeat the saving throw at the end of each of its turns. If a creature's saving throw is successful, the effect ends on it.<br/>&nbsp;<br/>A target that successfully saves is immune to this harpy's song for the next 24 hours. |<|
/*\
title: hash.js
type: application/javascript
module-type: macro
A hash generating macro for Tiddlywiki
\*/
(function() {

    /*jslint node: true, browser: true */
    /*global $tw: false */
    "use strict";

    exports.name = "hash";

    exports.params = [{
            name: "text",
            default: ""
        }
    ];

    /*
    Run the macro. Make sure it accepts the parameters you have defined above.
    */
    exports.run = function(text) {
        try {
            var theString = String(text);
            var hashcode = 0;
            var i = 0;
            var code = 0;
            
            for (i = 0; i < theString.length; i++) {
                code = theString.charCodeAt(i);
                hashcode  = ((hashcode << 5) - hashcode) + code;
                hashcode |= 0; // Convert to 32bit integer
            }
            
            return Math.abs(hashcode).toString(16);
        } catch (err) {
            console.error(err.stack)
            return "(ERROR: " + err.message + ") ";
        }
    };

})();
Choose a willing creature that you can see within range. Until the spell ends, the target’s speed is doubled, it gains a +2 bonus to AC, it has advantage on Dexterity saving throws, and it gains an additional action on each of its turns. That action can be used only to take the Attack (one weapon attack only), Dash, Disengage, Hide, or Use an Object action.

When the spell ends, the target can’t move or take actions until after its next turn, as a wave of lethargy sweeps over it.
While wearing this hat, you can use an action to cast the [[Disguise Self]] spell from it at will. The spell ends if the hat is removed.
"""
''Keen Sight.'' The hawk has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Talons +5>>|<<slashing 1>> |<<reach 5>> |
Your Intelligence score is 19 while you wear this headband. It has no effect on you if your Intelligence is 19 or higher without it.
Choose a creature that you can see within range. A surge of positive energy washes through the creature, causing it to regain 70 hit points. The spell also ends blindness, deafness, and any diseases affecting the target. This spell has no effect on constructs or undead.&nbsp;
A creature of your choice that you can see within range regains hit points equal to 1d4 + your spellcasting ability modifier. This spell has no effect on undead or constructs.
Choose a manufactured metal object, such as a metal weapon or a suit of heavy or medium metal armor, that you can see within range. You cause the object to glow red-hot. Any creature in physical contact with the object takes 2d8 fire damage when you cast the spell. Until the spell ends, you can use a bonus action on each of your subsequent turns to cause this damage again.

If a creature is holding or wearing the object and takes the damage from it, the creature must succeed on a Constitution saving throw or drop the object if it can. If it doesn’t drop the object, it has disadvantage on attack rolls and ability checks until the start of your next turn.
A ''heavily obscured'' area—such as darkness, opaque fog, or dense foliage—blocks vision entirely. A creature effectively suffers from the [[Blinded]] condition when trying to see something in that area.
"""
''Keen Hearing and Smell.'' The hound has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pack Tactics.'' The hound has advantage on an attack roll against a creature if at least one of the hound's allies is within 5 feet of the creature and the ally isn't incapacitated.
"""
<<divider>>
''Multiattack.'' The devil makes two attacks: one with its beard and one with its glaive.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d8+3>> <<fire 2d6>> |<<reach 5>> |
| !Fire Breath|''Recharge on 5-6''<br/>The hound exhales fire in a <<cone 15>>. Each creature in that area must make a <<save Dex 12>>, taking <<fire 6d6>> on a failed save, or <<halved>> on a successful one. |<|
Reaction: you are being damaged by a creature within 60 feet of you that you can see.

You point your finger, and the creature that damaged you is momentarily surrounded by hellish flames. The creature must make a Dexterity saving throw. It takes 2d10 fire damage on a failed save, or half as much damage on a successful one.
You have resistance to fire damage.
This dazzling helm is set with <<roll 1d10>> diamonds, <<roll 2d10>> rubies, <<roll 3d10>> fire opals, and <<roll 4d10>> opals. Any gem pried from the helm crumbles to dust. When all the gems are removed or destroyed, the helm loses its magic.

You gain the following benefits while wearing it:

* You can use an action to cast one of the following spells (<<save "Spell DC" 18>>), using one of the helm’s gems of the specified type as a component: [[Daylight]] (opal), [[Fireball]] (fire opal), [[Prismatic Spray]] (diamond), or [[Wall of Fire]] (ruby). The gem is destroyed when the spell is cast and disappears from the helm.
* As long as it has at least one diamond, the helm emits <<dim 30>> when at least one undead is within that area. Any undead that starts its turn in that area takes <<radiant 1d6>>.
* As long as the helm has at least one ruby, you have resistance to <<fire fire>> damage.
* As long as the helm has at least one fire opal, you can use an action and speak a command word to cause one weapon you are holding to burst into flames. The flames emit <<bright 10>> and an additional <<dim 10>>. The flames are harmless to you and the weapon. When you hit with an attack using the blazing weapon, the target takes an extra <<fire 1d6>>. The flames last until you use a bonus action to speak the command word again or until you drop or stow the weapon.

Roll a <<roll d20>> if you are wearing the helm and take <<fire fire>> damage as a result of failing a saving throw against a spell. On a roll of 1, the helm emits beams of light from its remaining gems. Each creature within 60 feet of the helm other than you must succeed on a <<save Dex 17>> or be struck by a beam, taking <<radiant radiant>> damage equal to the number of gems in the helm. The helm and its gems are then destroyed.
While wearing this helm, you can use an action to cast the [[Comprehend Languages]] spell from it at will.
While wearing this helm, you can use an action to cast the [[Detect Thoughts]] spell (<<save "Spell DC" 13>>) from it. As long as you maintain concentration on the spell, you can use a bonus action to send a telepathic message to a creature you are focused on. It can reply—using a bonus action to do so—while your focus on it continues.

While focusing on a creature with [[Detect Thoughts]], you can use an action to cast the [[Suggestion]] spell (<<save "Spell DC" 13>>) from the helm on that creature. Once used, the [[Suggestion]] property can’t be used again until the next dawn.
This helm has 3 charges. While wearing it, you can use an action and expend 1 charge to cast the [[Teleport]] spell from it. The helm regains <<roll 1d3>> expended charges daily at dawn.
This kit contains a variety of instruments such as clippers, mortar and pestle, and pouches and vials used by herbalists to create remedies and potions. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to identify or apply herbs. Also, proficiency with this kit is required to create antitoxin and potion of healing.

Proficiency with an herbalism kit allows you to identify plants and safely collect their useful elements.

''Components.'' An herbalism kit includes:

* pouches to store herbs
* clippers and leather gloves for collecting plants
* a mortar and pestle
* several glass jars.

''Arcana.'' Your knowledge of the nature and uses of herbs can add insight to your magical studies that deal with plants and your attempts to identify potions.

''Investigation.'' When you inspect an area overgrown with plants, your proficiency can help you pick out details and clues that others might miss.

''Medicine.'' Your mastery of herbalism improves your ability to treat illnesses and wounds by augmenting your methods of care with medicinal plants.

''Nature and Survival.'' When you travel in the wild, your skill in herbalism makes it easier to identify plants and spot sources of food that others might overlook.

''Identify Plants.'' You can identify most plants with a quick inspection of their appearance and smell.

| !Activity | !DC |
|!Find plants | 15 |
|!Identify poison | 20 |
You bring forth a great feast, including magnificent food and drink. The feast takes 1 hour to consume and disappears at the end of that time, and the beneficial effects don’t set in until this hour is over. Up to twelve other creatures can partake of the feast.

A creature that partakes of the feast gains several benefits. The creature is cured of all diseases and poison, becomes immune to poison and being frightened, and makes all Wisdom saving throws with advantage. Its hit point maximum also increases by 2d10, and it gains the same number of hit points. These benefits last for 24 hours.
A willing creature you touch is imbued with bravery.
Until the spell ends, the creature is immune to being [[Frightened]] and gains temporary hit points equal to your spellcasting ability modifier at the start of each of its turns. When the spell ends, the target loses any remaining temporary hit points from this spell.
"""
''Magic Resistance.'' The hezrou has advantage on saving throws against spells and other magical effects.
''Stench.'' Any creature that starts its turn within <<range 10>> of the hezrou must succeed on a <<save Con 14>> or be [[Poisoned]] until the start of its next turn. On a successful saving throw, the creature is immune to the hezrou’s stench for <<time 24h>>.
"""
<<divider>>
''Multiattack.'' The hezrou makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 2d10+4>> |<<reach 5>> |
| !<<melee Claw +7>>|<<slashing 2d6+4>> |<<reach 5>> |
"""
''Mechanical Trap''
"""
This pit has a cover constructed from material identical to the floor around it.

|max top|k
|!Detection |<<perception 15>> to discern an absence of foot traffic over the section of floor that forms the pit's cover.<br/>A successful <<investigation 15>> is necessary to confirm that the trapped section of floor is actually the cover of a pit. |
|!Trigger |Stepping on the cover. |
|!Effect |Cover swings open like a trapdoor, causing target to spill into the pit below. Target takes falling damage based on the pit's depth. |
|!Countermeasure #1 |Wedging an iron spike or similar item between the pit's cover and the floor in such a way that prevent the cover from opening,. |
|!Countermeasure #2 |Cover can be magically held shut using [[Arcane Lock]] or similar spell. |
Starting at 10th level, you can spend 1 minute creating camouflage for yourself. You must have access to fresh mud, dirt, plants, soot, and other naturally occurring materials with which to create your camouflage.

Once you are camouflaged in this way, you can try to hide by pressing yourself up against a solid surface, such as a tree or wall, that is at least as tall and wide as you are. You gain a +10 bonus to Dexterity (Stealth) checks as long as you remain there without moving or taking actions. Once you move or take an action or a reaction, you must camouflage yourself again to gain this benefit.
A creature of your choice that you can see within range perceives everything as hilariously funny and falls into fits of laughter if this spell affects it. The target must succeed on a Wisdom saving throw or fall [[Prone]], becoming [[Incapacitated]] and unable to stand up for the duration. A creature with an Intelligence score of 4 or less isn’t affected.

At the end of each of its turns, and each time it takes damage, the target can make another Wisdom saving throw. The target has advantage on the saving throw if it's triggered by damage. On a success, the spell ends.
When you try to hide, make a ''Dexterity (Stealth)'' check. Until you are ''discovered'' or you ''stop hiding'', that check's total is contested by the ''Wisdom (Perception)'' check of any creature that ''actively searches'' for signs of your presence.

You ''can't hide from a creature that can see you''. and if you ''make noise'' (such as shouting a warning or knocking over a vase), you ''give away your position''. An invisible creature can't be seen, so it can always try to hide. Signs of its passage might still be noticed, however, and it still has to stay quiet.

In combat, most creatures stay alert for signs of danger all around, so if you come ''out of hiding'' and ''approach a creature'', it usually sees you. However, under certain circumstances, the Dungeon Master might allow you to stay hidden as you approach a creature that is distracted, allowing you to gain advantage on an attack before you are seen.

''Passive Perception.'' When you hide, there's a chance someone will notice you even if they aren't searching. To determine whether such a creature notices you, the DM compares your ''Dexterity (Stealth)'' check with that creature's ''passive Wisdom (Perception)'' score, which equals 10 + the creature's Wisdom modifier, as well as any other bonuses or penalties. If the ''creature has advantage, add 5''. For ''disadvantage, subtract 5''.

For example, if a lst level character (with a proficiency bonus of +2) has a Wisdom of 15 (a +2 modifier) and proficiency in Perception, he or she has a passive Wisdom (Perception) of 14.

''What Can You See?'' One of the main factors in determining whether you can find a hidden creature or object is how well you can see in an area, which might be lightly or heavily obscured, as explained in chapter 8.
As a high elf, you have a keen mind and a mastery of at least the basics of magic. In many of the worlds of D&D, there are two kinds of high elves. One type (which includes the gray elves and valley elves of Greyhawk, the Silvanesti of Dragonlance, and the sun elves of the Forgotten Realms) is haughty and reclusive, believing themselves to be superior to non-elves and even other elves. The other type (including the high elves of Greyhawk, the Qualinesti of Dragonlance, and the moon elves of the Forgotten Realms) are more common and more friendly, and often encountered among humans and other races.

The sun elves of Faerûn (also called gold elves or sunrise elves) have bronze skin and hair of copper, black, or golden blond. Their eyes are golden, silver, or black. Moon elves (also called silver elves or gray elves) are much paler, with alabaster skin sometimes tinged with blue. They often have hair of silver-white, black, or blue, but various shades of blond, brown, and red are not uncommon. Their eyes are blue or green and flecked with gold.

|^!Ability Score Increase |^Your Intelligence score increases by 1. |
|^![[Elf Weapon Training]] |^{{Elf Weapon Training}} |
|^![[Cantrip|High Elf Cantrip]] |^{{High Elf Cantrip}} |
|^![[Extra Language|High Elf Extra Language]] |^{{High Elf Extra Language}} |
You know one cantrip of your choice from the wizard spell list. Intelligence is your spellcasting ability for it.
You can speak, read, and write one extra language of your choice. 
As a hill dwarf, you have keen senses, deep intuition, and remarkable resilience. The gold dwarves of Faerûn in their mighty southern kingdom are hill dwarves, as are the exiled Neidar and the debased Klar of Krynn in the Dragonlance setting.

|^!Ability Score Increase |^Your Wisdom score increases by 1. |
|^![[Dwarven Toughness]] |{{Dwarven Toughness}} |
''Multiattack.'' The giant makes two greatclub attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatclub +8>>|<<bludgeoning 3d8+5>> |<<reach 10>> |
| !<<ranged Rock +8>>|<<bludgeoning 3d10+5>> |<<range 60/240>> |
"""
''Keen Sight.'' The hippogriff has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The hippogriff makes two attacks: one with its beak and one with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +5>>|<<piercing 1d10+3>> |<<reach 5>> |
| !<<melee Claws +5>>|<<slashing 2d6+3>> |<<reach 5>> |
"""
''Martial Advantage.'' Once per turn, the hobgoblin can deal an extra <<damage 2d6>> to a creature it hits with a weapon attack if that creature is within 5 feet of an ally of the hobgoblin that isn't [[Incapacitated]].
"""
[img[divider.png]]

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Longsword +3>>|<<slashing 1d8+1>><br/><<slashing 1d10+1>> (''two handed'') |<<reach 5>> |
|^ !<<ranged Longbow +3>>|<<piercing 1d8+1>> |<<range 150/600>> |
Choose a creature that you can see within range. The target must succeed on a Wisdom saving throw or be [[Paralyzed]] for the duration. This spell has no effect on undead. At the end of each of its turns, the target can make another Wisdom saving throw. On a success, the spell ends on the target.
Choose a humanoid that you can see within range. The target must succeed on a Wisdom saving throw or be [[Paralyzed]] for the duration. At the end of each of its turns, the target can make another Wisdom saving throw. On a success, the spell ends on the target.
Divine light washes out from you and coalesces in a soft radiance in a 30-foot radius around you.

Creatures of your choice in that radius when you cast this spell shed dim light in a 5-foot radius and have advantage on all saving throws, and other creatures have disadvantage on attack rolls against them until the spell ends. In addition, when a fiend or an undead hits an affected creature with a melee attack, the aura flashes with brilliant light. The attacker must succeed on a Constitution saving throw or be blinded until the spell ends.
You gain a +3 bonus to attack and damage rolls made with this magic weapon. When you hit a fiend or an undead with it, that creature takes an extra <<radiant 2d10>>.

While you hold the drawn sword, it creates an aura in a 10-foot radius around you. You and all creatures friendly to you in the aura have advantage on saving throws against spells and other magical effects. If you have 17 or more levels in the [[Paladin]] class, the radius of the aura increases to 30 feet.
At 20th level, as an action, you can emanate an aura of sunlight. For 1 minute, bright light shines from you in a 30-foot radius, and dim light shines 30 feet beyond that.

Whenever an enemy creature starts its turn in the bright light, the creature takes 10 radiant damage.

In addition, for the duration, you have advantage on saving throws against spells cast by fiends or undead.

Once you use this feature, you can’t use it again until you finish a long rest.
//You can store and organize your personal materials here.  Just tag your tiddlers with one of these tags: //<<tag Adventure>><<tag Person>><<tag Organization>><<tag Location>><<tag Item>><<tag Monster>><<tag Image>><<tag Map>>

<<vtabs "[tag[Homebrew]tag[List]nsort[order]]">>
<<list-icons "[tag[Homebrew]tag[Adventure]sort[]]" "0 adventures found.">>
<<list-icons "[tag[Homebrew]tag[Image]sort[]]" "0 images found.">>
<<list-icons "[tag[Homebrew]tag[Item]sort[]]" "0 items found.">>
<<list-icons "[tag[Homebrew]tag[Location]sort[]]" "0 locations found.">>
<<list-icons "[tag[Homebrew]tag[Map]sort[]]" "0 maps found.">>
<<list-icons "[tag[Homebrew]tag[Monster]sort[]]" "0 monsters found.">>
<<list-icons "[tag[Homebrew]tag[Organization]sort[]]" "0 organizations found.">>
<<list-icons "[tag[Homebrew]tag[Person]sort[]]" "0 NPCs found.">>
"""
''Telepathic Bond.'' While the homunculus is on the same plane of existence as its master, it can magically convey what it senses to its master, and the two can communicate telepathically.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1>> |<<reach 5>> |
|~|Target must succeed on a <<save Con 10>> or be [[Poisoned]] for <<time 1m>>. If the saving throw fails by 5 or more, the target is instead [[Poisoned]] for <<time 1d10m>> and [[Unconscious]] while [[Poisoned]] in this way. |<|
Once on each of your turns when you make a weapon attack, you can make another attack with the same weapon against a different creature that is within 5 feet of the original target and within range of your weapon.
You can use an action to speak the horn’s command word and then blow the horn, which emits a thunderous blast in a <<cone 30>> that is audible 600 feet away. Each creature in the cone must make a <<save Con 15>> <fail><<thunder 5d6>> + [[Deafened]] for <<time 1m>></fail> <pass><<halved>></pass>. Creatures and objects made of glass or crystal have disadvantage on the saving throw and take <<thunder 10d6>> instead of 5d6.

Each use of the horn’s magic has a 20 percent chance of causing the horn to explode. The explosion deals <<fire 10d6>> to the blower and destroys the horn.
You can use an action to blow this horn. In response, warrior spirits from the plane of Ysgard appear within 60 feet of you. These spirits use the <<mob Berserker>> statistics from the Monster Manual. They return to Ysgard after <<time 1h>> or when they drop to <<hp 0>>. Once you use the horn, it can’t be used again until <<time 7d>> have passed.

Four types of horn of Valhalla are known to exist, each made of a different metal. The horn’s type determines how many berserkers answer its summons, as well as the requirement for its use. The DM chooses the horn’s type or determines it randomly.

|max top|k
| !d100 | !Horn Type | !Berserkers<br/>Summoned | !Requirement |
| !01-40 |[[Horn of Valhalla, Silver]] (Rare) | 2d4+2 |None |
| !41-75 |[[Horn of Valhalla, Brass]] (Rare) | 3d4+3 |Proficiency with all simple weapons |
| !76-90 |[[Horn of Valhalla, Bronze]] (Very Rare) | 4d4+4 |Proficiency with all medium armor |
| !91-00 |[[Horn of Valhalla, Iron]] (Legendary) | 5d4+5 |Proficiency with all martial weapons |

If you blow the horn without meeting its requirement, the summoned berserkers attack you. If you meet the requirement, they are friendly to you and your companions and follow your commands.
{{Horn of Valhalla}}
{{Horn of Valhalla}}
{{Horn of Valhalla}}
{{Horn of Valhalla}}
"""
''Devil's Sight.'' Magical darkness doesn't impede the devil's darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes three melee attacks: two with its fork and one with its tail. It can use Hurl Flame in place of any melee attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Fork +10>>|<<piercing 2d8+6>> |<<reach 10>> |
| !<<melee Tail +10>>|<<piercing 1d8+6>> |<<reach 10>> |
|!|If the target is a creature other than an undead or a construct, it must succeed on a <<save Con 17>> or lose <<damage 3d6>> at the start of each of its turns due to an infernal wound. Each time the devil hits the wounded target with this attack, the damage dealt by the wound increases by <<damage 3d6>>. Any creature can take an action to stanch the wound with a successful <<medicine 12>>. The wound also closes if the target receives magical healing. |<|
| !<<ranged "Hurl Flame" +7>>|<<fire 4d6>> |<<range 150>> |
|~|If the target is a flammable object that isn't being worn or carried, it also catches fire |<|
These iron horseshoes come in a set of four. While all four shoes are affixed to the hooves of a horse or similar creature, they allow the creature to move normally while floating 4 inches above the ground. This effect means the creature can cross or stand above nonsolid or unstable surfaces, such as water or lava. The creature leaves no tracks and ignores difficult terrain. In addition, the creature can move at normal speed for up to <<time 12h>> a day without suffering [[Exhaustion]] from a forced march.
These iron horseshoes come in a set of four. While all four shoes are affixed to the hooves of a horse or similar creature, they increase the creature’s walking speed by 30 feet.
<div style="display: flex;">
<<stat Huge 1 Object>>
<<stat Armor 10 Class>>
<<stat Hit 80 Points>>
</div>
<div style="display: flex;">
<<ability-value Strength 18>>
<<ability-value Dexterity 6>>
<<ability-value Constitution 10>>
<<ability-value Intelligence 3>>
<<ability-value Wisdom 3>>
<<ability-value Charisma 1>>
</div>
<table>

| !<<action>> Actions |<|<|
| !<<melee Slam +8>>|<<bludgeoning 2d12+4>> |<<reach 5>> |
!! Human Traits

It’s hard to make generalizations about humans, but your human character has these traits.

|^!Age |^Humans reach adulthood in their late teens and live less than a century. |
|^!Alignment |^Humans tend toward no particular alignment. The best and the worst are found among them. |
|^!Size |^Humans vary widely in height and build, from barely 5 feet to well over 6 feet tall. Regardless of your position in that range, your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Languages |^You can speak, read, and write Common and one extra language of your choice. Humans typically learn the languages of other peoples they deal with, including obscure dialects. They are fond of sprinkling their speech with words borrowed from other tongues: Orc curses, Elvish musical expressions, Dwarvish military phrases, and so on. |
|^!Ability Score Increase |^Your ability scores each increase by 1. |

<<subraces Human>>
Humanoids are the main peoples of the D&D world, both civilized and savage, including humans and a tremendous variety of other species. They have language and culture, few if any innate magical abilities (though most humanoids can learn spellcasting), and a bipedal form. The most common humanoid races are the ones most suitable as player characters: humans, dwarves, elves, and halflings. Almost as numerous but far more savage and brutal, and almost uniformly evil, are the races of goblinoids (gol:ilins, hobgoblins, and bugbears), orcs, gnolls, lizardfolk, and kobolds.

A variety of humanoids appear throughout this book, but the races detailed in the Player's Handbook- with the exception of drow are dealt with in appendix B. That appendix gives you a number of stat blocks that you· can use to make various members of those races.

<<list-box "[tag[Humanoid]sort[]]" "No humanoids found.">>
Emulating the Hunter archetype means accepting your place as a bulwark between civilization and the terrors of the wilderness. As you walk the Hunter’s path, you learn specialized techniques for fighting the threats you face, from rampaging ogres and hordes of orcs to towering giants and terrifying dragons.

{{||RangerAdvancementTemplate}}
{{||ClassAbilityTemplate}}
| !Level | !Proficiency Bonus | !Features | !Spells Known | !Spell Slots per Spell Level |<|<|<|<|
|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |[[Favored Enemy]], [[Natural Explorer]] | — | — | — | — | — | — |
| !2nd | +2 |[[Fighting Style|Ranger Fighting Style]], [[Spellcasting|Ranger Spellcasting]] | 2 | 2 | — | — | — | — |
| !3rd | +2 |[[Primeval Awareness]], ''Hunter:'' [[Hunter’s Prey]] | 3 | 3 | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 3 | 3 | — | — | — | — |
| !5th | +3 |[[Extra Attack|Ranger Extra Attack]] | 4 | 4 | 2 | — | — | — |
| !6th | +3 |[[Favored Enemy]], [[Natural Explorer]] | 4 | 4 | 2 | — | — | — |
| !7th | +3 |''Hunter:'' [[Defensive Tactics]] | 5 | 4 | 3 | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Ranger Ability Score Improvement]], [[Land’s Stride]] | 5 | 4 | 3 | — | — | — |
| !9th | +4 | — | 6 | 4 | 3 | 2 | — | — |
| !10th | +4 |[[Natural Explorer]], [[Hide in Plain Sight]] | 6 | 4 | 3 | 2 | — | — |
| !11th | +4 |''Hunter:'' [[Multiattack]] | 7 | 4 | 3 | 3 | — | — |
| !12th | +4 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 7 | 4 | 3 | 3 | — | — |
| !13th | +5 | — | 8 | 4 | 3 | 3 | 1 | — |
| !14th | +5 |[[Favored Enemy]], [[Vanish]] | 8 | 4 | 3 | 3 | 1 | — |
| !15th | +5 |''Hunter:'' [[Superior Hunter’s Defense]] | 9 | 4 | 3 | 3 | 2 | — |
| !16th | +5 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 9 | 4 | 3 | 3 | 2 | — |
| !17th | +6 | — | 10 | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |[[Feral Senses]] | 10 | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 11 | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |[[Foe Slayer]] | 11 | 4 | 3 | 3 | 3 | 2 |
When you are subjected to an effect, such as a red dragon’s fiery breath or a lightning bolt spell, that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on the saving throw, and only half damage if you fail.
"""
''Blood Frenzy. '' The shark has advantage on melee attack rolls against any creature that doesn't have all its hit points.
''Water Breathing.'' The shark can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 2d8+4>> |<<reach 5>> |
When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you.
You choose a creature you can see within range and mystically mark it as your quarry.
Until the spell ends, you deal an extra 1d6 damage to the target whenever you hit it with a weapon attack, and you have advantage on any Wisdom (Perception) or Wisdom (Survival) check you make to find it. If the target drops to 0 hit points before this spell ends, you can use a bonus action on a subsequent turn of yours to mark a new creature.
At 3rd level, you gain one of the following features of your choice.

''Colossus Slayer.'' Your tenacity can wear down the most potent foes. When you hit a creature with a weapon attack, the creature takes an extra 1d8 damage if it’s below its hit point maximum. You can deal this extra damage only once per turn.

''Giant Killer.'' When a Large or larger creature within 5 feet of you hits or misses you with an attack, you can use your reaction to attack that creature immediately after its attack, provided that you can see the creature.

''Horde Breaker.'' Once on each of your turns when you make a weapon attack, you can make another attack with the same weapon against a different creature that is within 5 feet of the original target and within range of your weapon.
Starting at 14th level, when you hit a creature with an attack, you can use this feature to instantly transport the target through the lower planes. The creature disappears and hurtles through a nightmare landscape.

At the end of your next turn, the target returns to the space it previously occupied, or the nearest unoccupied space. If the target is not a fiend, it takes 10d10 psychic damage as it reels from its horrific experience.

Once you use this feature, you can’t use it again until you finish a long rest.
"""
''Hold Breath.'' The hydra can hold its breath for 1 hour.
''Multiple Heads.'' The hydra has five heads. While it has more than one head, the hydra has advantage on saving throws against being [[Blinded]], [[Charmed]], [[Deafened]], [[Frightened]], [[Stunned]], and [[Unconscious]].
Whenever the hydra takes <<damage &ge;25>> in a single turn, one of its heads dies. If all its heads die, the hydra dies. 
At the end of its turn, it grows two heads for each of its heads that died since its last turn, unless it has taken <<fire>> since its last turn. The hydra regains <<heal 10>> for each head regrown in this way .
''Reactive Heads.'' For each head the hydra has beyond one, it gets an extra reaction that can be used only for opportunity attacks.
''Wakeful.'' While the hydra sleeps, at least one of its heads is awake.
"""
<<divider>>
''Multiattack.'' The hydra can make as many bite attacks as it has heads.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +8>>|<<piercing 1d10+5>> |<<reach 10>> |
"""
''Pack Tactics.'' The hyena has advantage on an attack roll against a creature if at least one of the hyena's allies is within 5 feet of the creature and the ally isn't incapacitated.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +2>>|<<piercing 1d6>> |<<reach 5>> |
You create a twisting pattern of colors that weaves through the air inside a 30-foot cube within range.
The pattern appears for a moment and vanishes. Each creature in the area who sees the pattern must make a Wisdom saving throw. On a failed save, the creature becomes [[Charmed]] for the duration. While [[Charmed]] by this spell, the creature is [[Incapacitated]] and has a speed of 0.

The spell ends for an affected creature if it takes any damage or if someone else uses an action to shake the creature out of its stupor.
"""
''Devil’s Sight.'' Magical darkness doesn’t impede the devil’s darkvision.
''Magic Resistance.'' The devil has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes three attacks: one with its bite, one with its claws, and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +10>>|<<piercing 2d6+5>>+<<cold 3d6>> |<<reach 5>> |
| !<<melee Claws +10>>|<<slashing 2d4+5>>+<<cold 3d6>> |<<reach 5>> |
| !<<melee Tail +10>>|<<bludgeoning 2d6+5>>+<<cold 3d6>> |<<reach 10>> |
| !Wall of Ice|''Recharge on 6''<br/>The devil magically forms an opaque wall of ice on a solid surface it can see within 60 feet of it. The wall is 1 foot thick and up to 30 feet long and 10 feet high, or it’s a hemispherical dome up to 20 feet in diameter.<br/>&nbsp;<br/>When the wall appears, each creature in its space is pushed out of it by the shortest route. The creature chooses which side of the wall to end up on, unless the creature is [[Incapacitated]]. The creature then makes a <<save Dex 17>>, taking <<cold 10d6>> on a failed save, or <<halved>> on a successful one.<br/>&nbsp;<br/>The wall lasts for <<time 1m>> or until the devil is [[Incapacitated]] or dies. The wall can be damaged and breached; each 10-foot section has <<ac 5>>, <<hp 30>>, vulnerability to <<fire>>fire damage, and immunity to <<acid>>acid, <<cold>>cold, <<necrotic>>necrotic, <<poison>>poison, and <<psychic>>psychic damage. If a section is destroyed, it leaves behind a sheet of frigid air in the space the wall occupied. Whenever a creature finishes moving through the frigid air on a turn, willingly or otherwise, the creature must make a <<save Con 17>>, taking <<cold 5d6>> on a failed save, or <<halved>> on a successful one. The frigid air dissipates when the rest of the wall vanishes. |<|
"""
''Death Burst.'' When the mephit dies, it explodes in a burst of jagged ice. Each creature within <<sphere 5>> of it must make a <<save Dex 10>>, taking <fail> <<slashing 1d8>></fail>, or <pass> <<halved>></pass>.
''False Appearance.'' While the mephit remains motionless, it is indistinguishable from an ordinary shard of ice.
''Innate Spellcasting (1/Day).'' The mephit can innately cast [[Fog Cloud]], requiring no material components. Its innate spellcasting ability is Charisma.
"""

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +3>>|<<slashing 1d4+1>> + <<cold 1d4>> |<<reach 5>> |
| !Frost Breath|''Recharge 6.''<br/>The mephit exhales a <<cone 15>> of cold air. Each creature in that area must succeed on a <<save Dex 10>>, taking <fail><<cold 2d4>></fail>, or <pass><<halved>></pass>. |<|
A hail of rock-hard ice pounds to the ground in a 20-foot-radius, 40-foot-high cylinder centered on a point within range. 
Each creature in the cylinder must make a Dexterity saving throw. A creature takes 2d8 bludgeoning damage and 4d6 cold damage on a failed save, or half as much damage on a successful one.

Hailstones turn the storm’s area of effect into difficult terrain until the end of your next turn.
<div align="center"><$link to={{!!title}}><$list filter="[all[current]has[icon]]"><$image source={{!!icon}} width=100 /><br/></$list><$list filter="[all[current]has[caption]]"><$view field=caption /></$list><$list filter="[all[current]!has[caption]]"><$view field=title /></$list></$link><$list filter="[all[current]has[level]]"><br/>//level <$view field=level />//</$list></div>
You choose one object that you must touch throughout the casting of the spell. If it is a magic item or some other magic-imbued object, you learn its properties and how to use them, whether it requires attunement to use, and how many charges it has, if any. You learn whether any spells are affecting the item and what they are. If the item was created by a spell, you learn which spell created it.

If you instead touch a creature throughout the casting, you learn what spells, if any, are currently affecting it.
You write on parchment, paper, or some other suitable writing material and imbue it with a potent illusion that lasts for the duration.

To you and any creatures you designate when you cast the spell, the writing appears normal, written in your hand, and conveys whatever meaning you intended when you wrote the text. To all others, the writing appears as if it were written in an unknown or magical script that is unintelligible. Alternatively, you can cause the writing to appear to be an entirely different message, written in a different hand and language, though the language must be one you know.

Should the spell be dispelled, the original script and the illusion both disappear.
A creature with truesight can read the hidden message.
<<htabs "[tag[Image]tag[Category]sort[order]]">>
This flat iron rod has a button on one end. You can use an action to press the button, which causes the rod to become magically fixed in place. Until you or another creature uses an action to push the button again, the rod doesn’t move, even if it is defying gravity. The rod can hold up to 8,000 pounds of weight. More weight causes the rod to deactivate and fall. A creature can use an action to make a <<skillcheck Str 30>>, moving the fixed rod up to 10 feet on a success.
"""
''Shapechanger.'' The imp can use its action to polymorph into a beast form that resembles a rat (speed 20 ft.), a raven (20 ft., fly 60 ft.), or a spider (20 ft., climb 20 ft.), or back into its true form. Its statistics are the same in each form, except for the speed changes noted. Any equipment it is wearing or carrying isn't transformed. It reverts to its true form if it dies.
''Devil's Sight.'' Magical darkness doesn't impede the imp's darkvision.
''Magic Resistance.'' The imp has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The devil makes two attacks: one with its bite and one with its fork or two with its tail spines.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Sting +5>>|<<piercing 1d4+3>> |<<reach 5>> |
|~|The target must make a <<save Con 11>>, taking <<poison 3d6>> on a failed save, or <<halved>> on a successful one |<|
| !Invisibility|The imp magically turns [[Invisible]] until it attacks, or until its concentration ends (as if concentrating on a spell). Any equipment the imp wears or carries is invisible with it. |<|
You create a magical restraint to hold a creature that you can see within range.
The target must succeed on a Wisdom saving throw or be bound by the spell; if it succeeds, it is immune to this spell if you cast it again. While affected by this spell, the creature doesn't need to breathe, eat, or drink, and it doesn’t age. Divination spells can’t locate or perceive the target.

When you cast the spell, you choose one of the following forms of imprisonment.

<b>Burial</b>
The target is entombed far beneath the earth in a sphere of magical force that is just large enough to contain the target. Nothing can pass through the sphere, nor can any creature teleport or use planar travel to get into or out of it.
The special component for this version of the spell is a small mithral orb.

<b>Chaining</b>
Heavy chains, firmly rooted in the ground, hold the target in place. The target is [[Restrained]] until the spell ends, and it can’t move or be moved by any means until then.
The special component for this version of the spell is a fine chain of precious metal.

<b>Hedged Prison</b>
The spell transports the target into a tiny demiplane that is warded against teleportation and planar travel. The demiplane can be a labyrinth, a cage, a tower, or any similar confined structure or area of your choice.
The special component for this version of the spell is a miniature representation of the prison made from jade.

<b>Minimus Containment</b>
The target shrinks to a height of 1 inch and is imprisoned inside a gemstone or similar object. Light can pass through the gemstone normally (allowing the target to see out and other creatures to see in), but nothing else can pass through, even by means of teleportation or planar travel. The gemstone can’t be cut or broken while the spell remains in effect.
The special component for this version of the spell is a large, transparent gemstone, such as a corundum, diamond, or ruby.

<b>Slumber</b>
The target falls asleep and can’t be awoken.
The special component for this version of the spell consists of rare soporific herbs. 

<b>Ending the Spell</b>
During the casting of the spell, in any of its versions, you can specify a condition that will cause the spell to end and release the target. The condition can be as specific or as elaborate as you choose, but the DM must agree that the condition is ;reasonable and has a likelihood of coming to pass. The conditions can be based on a creature’s name, identity, or deity but otherwise must be based on observable ;actions or qualities and not based on intangibles such as level, class, or hit points.

A dispel magic spell can end the spell only if it is cast as a 9th-level spell, targeting either the prison or the special component used to create it.

You can use a particular special component to create only one prison at a time. If you cast the spell again using the same component, the target of the first casting is immediately freed from its binding.
Beginning when you choose this archetype at 3rd level, your weapon attacks score a critical hit on a roll of 19 or 20.
By 11th level, you are so suffused with righteous might that all your melee weapon strikes carry divine power with them. Whenever you hit a creature with a melee weapon, the creature takes an extra 1d8 radiant damage.
''Prerequisite:'' Pact of the Blade feature

You can use any weapon you summon with your Pact of the Blade feature as a spellcasting focus for your warlock spells.

In addition, the weapon gains a +1 bonus to its attack and damage rolls, unless it is a magic weapon that already has a bonus to those rolls.

Finally, the weapon you conjure can be a shortbow, longbow, light crossbow, or heavy crossbow.

An incapacitated creature can't take actions or reactions.
A swirling cloud of smoke shot through with white-hot embers appears in a 20-foot-radius sphere centered on a point within range.
The cloud spreads around corners and is heavily obscured. It lasts for the duration or until a wind of moderate or greater speed (at least 10 miles per hour) disperses it.

When the cloud appears, each creature in it must make a Dexterity saving throw. A creature takes 10d8 fire damage on a failed save, or half as much damage on a successful one. A creature must also make this saving throw when it enters the spell’s area for the first time on a turn or ends its turn there.

The cloud moves 10 feet directly away from you in a direction that you choose at the start of each of your turns.
|max top|k
| !d100 | !Flaw (lasts until cured) |
| !01–15 |“Being drunk keeps me sane.” |
| !16–25 |“I keep whatever I find.” |
| !26–30 |“I try to become more like someone else I know — adopting his or her style of dress, mannerisms, and name.” |
| !31–35 |“I must bend the truth, exaggerate, or outright lie to be interesting to other people.” |
| !36–45 |“Achieving my goal is the only thing of interest to me, and I’ll ignore everything else to pursue it.” |
| !46–50 |“I find it hard to care about anything that goes on around me.” |
| !51–55 |“I don’t like the way people judge me all the time.” |
| !56–70 |“I am the smartest, wisest, strongest, fastest, and most beautiful person I know.” |
| !71–80 |“I am convinced that powerful enemies are hunting me, and their agents are everywhere I go. I am sure they’re watching me all the time.” |
| !81–85 |“There’s only one person I can trust. And only I can see this special friend.” |
| !86–95 |“I can’t take anything seriously. The more serious the situation, the funnier I find it.” |
| !96–100 |“I’ve discovered that I really like killing people.” |
<$list filter="[all[current]tag[Index]]">

<hr/>
<h2>Index</h2>
<div class="tc-table-of-contents">
<$macrocall $name="toc-selective-expandable" tag=<<currentTiddler>> sort="sort[title]" />
</div>
<hr/>
</$list>
Beginning at 9th level, you can reroll a saving throw that you fail. If you do so, you must use the new roll, and you can’t use this feature again until you finish a long rest.

You can use this feature twice between long rests starting at 13th level and three times between long rests starting at 17th level.
{{Indomitable}}
{{Indomitable}}
Beginning at 18th level, if your total for a Strength check is less than your Strength score, you can use that score in place of the total.
You know the [[Thaumaturgy]] cantrip. When you reach 3rd level, you can cast the [[Hellish Rebuke]] spell as a 2nd-level spell once with this trait and regain the ability to do so when you finish a long rest. When you reach 5th level, you can cast the darkness spell once with this trait and regain the ability to do so when you finish a long rest. Charisma is your spellcasting ability for these spells.
Make a melee spell attack against a creature you can reach. On a hit, the target takes 3d10 necrotic damage.
A creature must swallow an entire dose of ingested poison to suffer its effects. The dose can be delivered in food or a liquid. You may decide that a partial dose has a reduced effect, such as allowing advantage on the saving throw or dealing only half damage on a failed save.

<<vtabs "[tag[Poison]tag[Ingested]sort[]]">>
These poisons are powders or gases that take effect when inhaled. Blowing the powder or releasing the gas subjects creatures in a 5 foot cube to its effect. The resulting cloud dissipates immediately afterward. Holding one’s breath is ineffective against inhaled poisons, as they affect nasal membranes, tear ducts, and other parts of the body.

<<vtabs "[tag[Poison]tag[Inhaled]sort[]]">>
Injury poison can be applied to weapons, ammunition, trap components, and other objects that deal piercing or slashing damage and remains potent until delivered through a wound or washed off. A creature that takes piercing or slashing damage from an object coated with the poison is exposed to its effects.

<<vtabs "[tag[Poison]tag[Injury]sort[]]">>
Swarming, biting locusts fill a 20-foot-radius sphere centered on a point you choose within range. The sphere spreads around corners. The sphere remains for the duration, and its area is lightly obscured. The sphere’s area is difficult terrain.

When the area appears, each creature in it must make a Constitution saving throw. A creature takes 4d10 piercing damage on a failed save, or half as much damage on a successful one. A creature must also make this saving throw when it enters the spell’s area for the first time on a turn or ends its turn there.
Different kinds of insects can gather in swarms, and each swarm has the special characteristics described below.

"""
[[Swarm of Beetles]]. A swarm of beetles gains a burrowing speed of 5 feet.
[[Swarm of Centipedes]]. A creature reduced to <<hp 0>> by a swarm of centipedes is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and [[Paralyzed]] while [[Poisoned]] in this way.
[[Swarm of Spiders]]. A swarm of spiders has the following additional traits.
&nbsp;&nbsp;&nbsp;&nbsp;''Spider Climb.'' The swarm can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
&nbsp;&nbsp;&nbsp;&nbsp;''Web Sense.'' While in contact with a web, the swarm knows the exact location of any other creature in contact with the same web.
&nbsp;&nbsp;&nbsp;&nbsp;''Web Walker.'' The swarm ignores movement restrictions caused by webbing.
[[Swarm of Wasps]]. A swarm of wasps has a walking speed of 5 feet, a flying speed of 30 feet, and no climbing speed.
"""
You can use an action to place this 1-inch metal cube on the ground and speak its command word. The cube rapidly grows into a fortress that remains until you use an action to speak the command word that dismisses it, which works only if the fortress is empty.

The fortress is a square tower, 20 feet on a side and 30 feet high, with arrow slits on all sides and a battlement atop it. Its interior is divided into two floors, with a ladder running along one wall to connect them. The ladder ends at a trapdoor leading to the roof. When activated, the tower has a small door on the side facing you. The door opens only at your command, which you can speak as a bonus action. It is immune to the [[Knock]] spell and similar magic, such as that of a [[Chime of Opening]].

Each creature in the area where the fortress appears must make a <<save Dex 15>> <fail><<bludgeoning 10d10>></fail> <pass><<halved>></pass>. In either case, the creature is pushed to an unoccupied space outside but next to the fortress. Objects in the area that aren’t being worn or carried take this damage and are pushed automatically.

The tower is made of adamantine, and its magic prevents it from being tipped over. The roof, the door, and the walls each have <<hp 100>>, immunity to damage from nonmagical weapons excluding siege weapons, and resistance to all other damage. Only a [[Wish]] spell can repair the fortress (this use of the spell counts as replicating a spell of 8th level or lower). Each casting of wish causes the roof, the door, or one wall to regain <<heal 50>>.
You touch an object weighing 10 pounds or less whose longest dimension is 6 feet or less. The spell leaves an invisible mark on its surface and invisibly inscribes the name of the item on the sapphire you use as the material component. Each time you cast this spell, you must use a different sapphire. 

At any time thereafter, you can use your action to speak the item’s name and crush the sapphire. The item instantly appears in your hand regardless of physical or planar distances, and the spell ends.

If another creature is holding or carrying the item, crushing the sapphire doesn’t transport the item to you, but instead you learn who the creature possessing the object is and roughly where that creature is located at that moment. 

[[Dispel Magic]] or a similar effect successfully applied to the sapphire ends this spell’s effect.
<div class="gallery">
<$list filter="[all[tiddlers]tag[Image]!has[_canonical_uri]sort[]]"><$link to=<<currentTiddler>> tooltip=<<currentTiddler>> class="icon" ><$image source=<<currentTiddler>> /></$link></$list>
</div>
Beginning at 10th level, you can use your action to frighten someone with your menacing presence. When you do so, choose one creature that you can see within 30 feet of you. If the creature can see or hear you, it must succeed on a Wisdom saving throw (DC equal to 8 + your proficiency bonus + your Charisma modifier) or be frightened of you until the end of your next turn. On subsequent turns, you can use your action to extend the duration of this effect on the frightened creature until the end of your next turn. This effect ends if the creature ends its turn out of line of sight or more than 60 feet away from you.

If the creature succeeds on its saving throw, you can’t use this feature on that creature again for 24 hours.

"""
''Prerequisite:'' Pact of the Chain feature
"""

When you cast find familiar, you infuse the summoned familiar with a measure of your eldritch power, granting the creature the following benefits:

* The familiar gains either a flying speed or a swimming speed (your choice) of 40 feet.
* As a bonus action, you can command the familiar to take the Attack action.
* The familiar’s weapon attacks are considered magical for the purpose of overcoming immunity and resistance to nonmagical attacks.
* If the familiar forces a creature to make a saving throw, it uses your spell save DC.
* When the familiar takes damage, you can use your reaction to grant it resistance against that damage.
A creature you touch becomes invisible until the spell ends. Anything the target is wearing or carrying is invisible as long as it is on the target’s person. The spell ends for a target that attacks or casts a spell.
* An invisible creature is impossible to see without the aid of magic or a special sense. For the purpose of hiding, the creature is [[Heavily Obscured]]. The creature's location can be detected by any noise it makes or any tracks it leaves.
* Attack rolls against the creature have disadvantage, and the creature's attack rolls have advantage.
"""
''Invisibility.'' The stalker is [[Invisible]].
''Faultless Tracker.'' The stalker is given a quarry by its summoner. The stalker knows the direction and distance to its quarry as long as the two of them are on the same plane of existence. The stalker also knows the location of its summoner.
"""
[img[divider.png]]
''Multiattack.'' The stalker makes two slam attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +6>>|<<bludgeoning 2d6+3>> |<<reach 5>> |
An Ioun stone is named after Ioun, a god of knowledge and prophecy revered on some worlds. Many types of Ioun stone exist, each type a distinct combination of shape and color.

When you use an action to toss one of these stones into the air, the stone orbits your head at a distance of 1d3 feet and confers a benefit to you. Thereafter, another creature must use an action to grasp or net the stone to separate it from you, either by making a successful attack roll against <<ac 24>> or a successful <<acrobatics 24>>. You can use an action to seize and stow the stone, ending its effect.

A stone has <<ac 24>>, <<hp 10>>, and resistance to all damage. It is considered to be an object that is being worn while it orbits your head.
{{Ioun Stone}}

''Absorption.'' While this pale lavender ellipsoid orbits your head , you can use your reaction to cancel a spell of 4th level or lower cast by a creature you can see and targeting only you.

Once the stone has canceled 20 levels of spells, it burns out and turns dull gray, losing its magic. If you are targeted by a spell whose level is higher than the number of spell levels the stone has left, the stone can't cancel it.
{{Ioun Stone}}

''Agility.'' Your Dexterity score increases by 2, to a maximum of 20 , while this deep red sphere orbits your head.
{{Ioun Stone}}

''Awareness.'' You can't be surprised while this dark blue rhomboid orbits your head.
{{Ioun Stone}}

''Fortitude.'' Your Constitution score increases by 2, to a maximum of 20, while this pink rhomboid orbits your head.
{{Ioun Stone}}

''Greater Absorption.'' While this marbled lavender and green ellipsoid orbits your head, you can use your reaction to cancel a spell of 8th level or lower cast by a creature you can see and targeting only you.

Once the stone has canceled 50 levels of spells , it burns out and turns dull gray, losing its magic. If you are targeted by a spell whose level is higher than the number of spell levels the stone has left, the stone can't cancel it.
{{Ioun Stone}}

''Insight.'' Your Wisdom score increases by 2, to a maximum of 20, while this incandescent blue sphere orbits your head.
{{Ioun Stone}}

''Intellect.'' Your Intelligence score increases by 2, to a maximum of 20, while this marbled scarlet and blue sphere orbits your head.
{{Ioun Stone}}

''Leadership.'' Your Charisma score increases by 2, to a maximum of 20, while this marbled pink and green sphere orbits your head.
{{Ioun Stone}}

''Mastery.'' Your proficiency bonus increases by 1 while this pale green prism orbits your head.
{{Ioun Stone}}

''Protection.'' You gain a +1 bonus to AC while this dusty rose prism orbits your head.
{{Ioun Stone}}

''Regeneration.'' You regain 15 hit points at the end of each hour this pearly white spindle orbits your head , provided that you have at least 1 hit point.
{{Ioun Stone}}

''Reserve.'' This vibrant purple prism stores spells cast into it, holding them until you use them. The stone can store up to 3 levels worth of spells at a time. When found, it contains 1d4-1 levels of stored spells chosen by the DM. 

Any creature can cast a spell of 1st through 3rd level into the stone by touching it as the spell is cast. The spell has no effect, other than to be stored in the stone. If the stone can't hold the spell, the spell is expended without effect. The level of the slot used to cast the spell determines how much space it uses.

While this stone orbits your head , you can cast any spell stored in it. The spell uses the slot level, spell save DC, spell attack bonus , and spellcasting ability of the original caster , but is otherwise treated as if you cast the spell. The spell cast from the stone is no longer stored in
it, freeing up space.
{{Ioun Stone}}

''Strength.'' Your Strength score increases by 2, to a maximum of 20, while this pale blue rhomboid orbits your head.
{{Ioun Stone}}

''Sustenance.'' You don't need to eat or drink while this clear spindle orbits your head.
{{Ioun Stone}}

''Vitality.'' You gain a +1 bonus to death saving throws while this luminous green-and-blue marbled sphere orbits your head.
This rusty iron sphere measures 3 inches in diameter and weighs 1 pound. You can use an action to speak the command word and throw the sphere at a Huge or smaller creature you can see within 60 feet of you. As the sphere moves through the air, it opens into a tangle of metal bands.

Make a ranged attack roll with an attack bonus equal to your Dexterity modifier plus your proficiency bonus. On a hit, the target is [[Restrained]] until you take a bonus action to speak the command word again to release it. Doing so, or missing with the attack, causes the bands to contract and become a sphere once more.

A creature, including the one restrained, can use an action to make a <<skillcheck Str 20>> to break the iron bands. On a success, the item is destroyed, and the [[Restrained]] creature is freed. If the check fails, any further attempts made by that creature automatically fail until <<time 24>> have elapsed.

Once the bands are used, they can’t be used again until the next dawn.
This iron bottle has a brass stopper. You can use an action to speak the flask’s command word, targeting a creature that you can see within 60 feet of you. If the target is native to a plane of existence other than the one you’re on, the target must succeed on a <<save Wis 17>> or be trapped in the flask. If the target has been trapped by the flask before, it has advantage on the saving throw. Once trapped, a creature remains in the flask until released. The flask can hold only one creature at a time. A creature trapped in the flask doesn’t need to breathe, eat, or drink and doesn’t age.

You can use an action to remove the flask’s stopper and release the creature the flask contains. The creature is friendly to you and your companions for <<time 1h>> and obeys your commands for that duration. If you give no commands or give it a command that is likely to result in its death, it defends itself but otherwise takes no actions. At the end of the duration, the creature acts in accordance with its normal disposition and alignment.

An [[Identify]] spell reveals that a creature is inside the flask, but the only way to determine the type of creature is to open the flask. A newly discovered bottle might already contain a creature chosen by the DM or determined randomly.

|max top|k
| !d100 | !Contents | !d100 | !Contents |
| !01–50 |Empty | !77–78 |Elemental (any) |
| !51 |<<mob Arcanaloth>> | !79 |<<mob "Githyanki Knight">> |
| !52 |<<mob Cambion>> | !80 |<<mob "Githzerai Zerth">> |
| !53–54 |<<mob Dao>> | !81–82 |<<mob "Invisible Stalker">> |
| !55–57 |Demon (type 1)	| !83–84 |<<mob Marid>> |
| !58–60 |Demon (type 2)	| !85–86 |<<mob Mezzoloth>> |
| !61–62 |Demon (type 3)	| !87–88 |<<mob "Night Hag">> |
| !63–64 |Demon (type 4)	| !89–90 |<<mob Nycaloth>> |
| !65 |Demon (type 5)	| !91 |<<mob Planetar>> |
| !66 |Demon (type 6)	| !92–93 |<<mob Salamander>> |
| !67 |<<mob Deva>>	| !94–95 |Slaad (any) |
| !68–69 |Devil (greater)	| !96 |<<mob Solar>> |
| !70–72 |Devil (lesser)	| !97–98 |<<mob Succubus/Incubus>> |
| !73–74 |<<mob Djinni>> | !99 |<<mob Ultroloth>> |
| !75–76 |<<mob Efreeti>> | !00 |<<mob Xorn>> |
"""
''Fire Absorption.'' Whenever the golem is subjected to fire damage, it takes no damage and instead regains a number of hit points equal to the fire damage dealt.
''Immutable Form.'' The golem is immune to any spell or effect that would alter its form.
''Magic Resistance.'' The golem has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The golem’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The golem makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +13>>|<<bludgeoning 3d8+7>> |<<reach 5>> |
| !<<melee Sword +13>>|<<slashing 3d10+7>>|<<reach 10>> |
| !Poison Breath|''Recharge 6''<br/>The golem exhales poisonous gas in a <<cone 15>>. Each creature in that area must make a <<save Con 19>>, taking <<poison 10d8>> damage on a failed save, or <<halved>> on a successful one. |<|
Choose one creature that you can see within range. The target begins a comic dance in place: shuffling, tapping its feet, and capering for the duration. Creatures that can't be [[Charmed]] are immune to this spell.

A dancing creature must use all its movement to dance without leaving its space and has disadvantage on Dexterity saving throws and attack rolls. While the target is affected by this spell, other creatures have advantage on attack rolls against it. As an action, a dancing creature makes a Wisdom saving throw to regain control of itself. On a successful save, the spell ends.
<<vtabs "[tag[Item]tag[List]nsort[order]]">>
<$list filter="[all[current]tag[Magic Item]]">

|''Name'' |<$edit-text field=caption size=80/>|
|''Type'' |<$edit-text field=item_type size=60 />|
|''Rarity'' |<$edit-text field=rarity size=60 />|
|''Attunement'' |<$edit-text field=attunement size=60/>|
</$list>
<$list filter="[all[current]tag[Magic Item]]">//<$list filter="[all[current]!has[item_type]]">Wonderous item</$list><$list filter="[all[current]has[item_type]]">{{!!item_type}}</$list>, <$list filter="[all[current]!has[rarity]]"><$list filter="[all[current]tag[Common]]">common</$list><$list filter="[all[current]tag[Uncommon]]">uncommon</$list><$list filter="[all[current]tag[Rare]]">rare</$list><$list filter="[all[current]tag[Very Rare]]">very rare</$list><$list filter="[all[current]tag[Legendary]]">legendary</$list></$list><$list filter="[all[current]has[rarity]]">{{!!rarity}}</$list>&nbsp;<$list filter="[all[current]tag[Attunement]!has[attunement]]">(requires attunement)</$list><$list filter="[all[current]tag[Attunement]has[attunement]]">({{!!attunement}})</$list>//
</$list>
Starting at 2nd level, you can add half your proficiency bonus, rounded down, to any ability check you make that doesn’t already include your proficiency bonus.
"""
''Keen Hearing and Smell.'' The jackal has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pack Tactics.'' The jackal has advantage on an attack roll against a creature if at least one of the jackal’s allies is within 5 feet of the creature and the ally isn’t [[Incapacitated]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +1>>|<<piercing 1d4-1>> |<<reach 5>> |
<<vtabs "[tag[Javascript]sort[]]">>
This javelin is a magic weapon. When you hurl it and speak its command word, it transforms into a bolt of lightning, forming a 5 feet wide, <<line 120>>. Each creature in the line excluding you and the target must make a <<save Dex 13>> <fail><<lightning 4d6>></fail> <pass><<halved>></pass>. The lightning bolt turns back into a javelin when it reaches the target. Make a ranged weapon attack against the target. On a hit, the target takes damage from the javelin plus <<lightning 4d6>>.

The javelin’s property can’t be used again until the next dawn. In the meantime, the javelin can still be used as a magic weapon.
Training with jeweler’s tools includes the basic techniques needed to beautify gems. It also gives you expertise in identifying precious stones.

''Components.'' Jeweler’s tools consist of:

* a small saw and hammer
* files
* pliers
* tweezers

''Arcana.'' Proficiency with jeweler’s tools grants you knowledge about the reputed mystical uses of gems. This insight proves handy when you make Arcana checks related to gems or gem-encrusted items.

''Investigation.'' When you inspect jeweled objects, your proficiency with jeweler’s tools aids you in picking out clues they might hold.

''Identify Gems.'' You can identify gems and determine their value at a glance.

| !Activity | !DC |
|!Modify a gem’s appearance | 15 |
|!Determine a gem’s history | 20 |
You touch a creature. The creature’s jump distance is tripled until the spell ends.
!! Jumping Summary Table

| !Type of Jump | !Distance Jumped<br/>(Feet) | !Height of Jump<br/>(Feet) |
|!| !Standing Jump |<|
|!Long Jump |Strength / 2 |Strength / 8 |
|!High Jump | &mdash; |(3 + Strength modifier) / 2 |
|!| !Running Jump<br/>(Must move at least 10 feet) |<|
|!Long Jump | Strength |Strength / 4 |
|!High Jump | &mdash; |3 + Strength modifier |

| !Reaching Up |Jump Height + 1.5 x Physical Height |

!!! ''Details'' 

Your Strength determines how far you can jump. 

''Long Jump.'' When you make a long jump. you cover a number of feet up to your Strength score if you move at least 10 feet on foot immediately before the jump. When you make a standing long jump, you can leap only half that distance. Either way, each foot you clear on the jump costs a foot of movement.

This rule assumes that the height of your jump doesn't matter. such as a jump across a stream or chasm. ''At your DM's option'', you must succeed on a ''DC 10 Strength (Athletics) check'' to clear a low obstacle (no taller than a quarter of the jump's distance), such as a hedge or low wall. Otherwise. you hit it. 

When you land in difficult terrain. you must succeed on a ''DC 10 Dexterity (Acrobatics) check'' to land on your feet. Otherwise. you land prone. 

''High Jump.'' When you make a high jump. you leap into the air a number offset equal to 3 + your Strength modifier if you move at least 10 feet on foot immediately before the jump. When you make a standing high jump, you can jump only half that distance. Either way, each foot you clear on the jump costs a foot of movement. In some circumstances. ''your DM might allow you to make a Strength (Athletics) check to jump higher than you normally can''.

You can extend your arms half your height above yourself during the jump. Thus. you can reach above you a distance equal to the height of the jump plus 1&frac12; times your height.
You have proficiency in the Perception skill.
Starting at 2nd level, your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points. Your monk level determines the number of points you have, as shown in the Ki Points column of the Monk table.

You can spend these points to fuel various ki features. You start knowing three such features: [[Flurry of Blows]], [[Patient Defense]], and [[Step of the Wind]]. You learn more ki features as you gain levels in this class.

When you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.

Some of your ki features require your target to make a saving throw to resist the feature’s effects. The saving throw DC is calculated as follows:

''Ki save DC ='' 8 + your proficiency bonus + your Wisdom modifier

<<p "Flurry of Blows">>
<<p "Patient Defense">>
<<p "Step of the Wind">>

!!! ''Ki-Related Abilities''

{{Ki Category}}
<<htabs "[tag[Ki Category]sort[order]]">>
Starting at 6th level, your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.
"""
''Optional Class Feature''
"""

If you spend 1 ki point or more as part of your action on your turn, you can make one attack with an unarmed strike or a monk weapon as a bonus action before the end of the turn.
"""
''Echolocation.'' The whale can’t use its [[Blindsight]] while [[Deafened]].
''Hold Breath.'' The whale can hold its breath for <<time 30m>>.
''Keen Hearing.'' The whale has advantage on Wisdom (Perception) checks that rely on hearing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 5d6+4>> |<<reach 5>> |
"""
''Brave.'' The knight has advantage on saving throws against being [[Frightened]].
"""
<<divider>>
''Multiattack.'' The knight makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +5>>|<<slashing 2d6+3>> |<<reach 5>> |
| !<<ranged "Heavy Crossbow" +2>>|<<piercing 1d10>> |<<range 100/400>> |
| !Leadership|''Recharges after a Short or Long Rest.''<br/>For <<time 1m>>, the knight can utter a special command or warning whenever a nonhostile creature that it can see within 30 feet of it makes an attack roll or a saving throw. The creature can add a <<roll 1d4>> to its roll provided it can hear and understand the knight. A creature can benefit from only one Leadership die at a time. This effect ends if the knight is [[Incapacitated]]. |<|
| !<<reaction>> Reactions |<|<|
| !Parry|The knight adds <<ac +2>> against one melee attack that would hit it. To do so, the knight must see the attacker and be wielding a melee weapon. |<|
Choose an object that you can see within range. The object can be a door, a box, a chest, a set of manacles, a padlock, or another object that contains a mundane or magical means that prevents access.

A target that is held shut by a mundane lock or that is stuck or barred becomes unlocked, unstuck, or unbarred. If the object has multiple locks, only one of them is unlocked.

If you choose a target that is held shut with arcane lock, that spell is suppressed for 10 minutes, during which time the target can be opened and shut normally.

When you cast the spell, a loud knock, audible from as far away as 300 feet, emanates from the target object.
"""
''Sunlight Sensitivity.'' While in sunlight, the kobold has <<disadvantage>> on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
''Pack Tactics.'' The kobold has <<advantage>> on an attack roll against a creature if at least one of the kobold’s allies is within 5 feet of the creature and the ally isn’t incapacitated.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Dagger +4>>|<<piercing 1d4+2>> |<<reach 5>> |
| !<<ranged Sling +4>>|<<bludgeoning 1d4+2>> |<<range 30/120>> |
"""
''Amphibious.'' The kraken can breathe air and water.
''Freedom of Movement.'' The kraken ignores <<difficult>>, and magical effects can’t reduce its speed or cause it to be [[Restrained]]. It can spend 5 feet of movement to escape from nonmagical restraints or being [[Grappled]].
''Siege Monster.'' The kraken deals double damage to objects and structures.
"""
<<divider>>
''Multiattack.'' The kraken makes three tentacle attacks, each of which it can replace with one use of Fling.

<<fold "Kraken Lair Action">>
<<fold "Kraken Regional Effect">>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee  Bite +17>>|<<piercing 3d8+10>> |<<reach 5>> |
|~|If the target is a Large or smaller creature [[Grappled]] by the kraken, that creature is swallowed, and the grapple ends. While swallowed, the creature is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the kraken, and it takes <<acid 12d6>> at the start of each of the kraken’s turns.<br/><br/>If the kraken takes <<damage &ge;50>> on a single turn from a creature inside it, the kraken must succeed on a <<save Con 25>> at the end of that turn or regurgitate all swallowed creatures, which fall [[Prone]] in a space within 10 feet of the kraken. If the kraken dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse using 15 feet of movement, exiting [[Prone]]. |<|
| !<<melee Tentacle +17>>|<<bludgeoning 3d6+10>> |<<reach 30>> |
|~|Target is [[Grappled]] (<<skillcheck Escape 18>>). Until this grapple ends, the target is [[Restrained]]. The kraken has ten tentacles, each of which can grapple one target. |<|
| !Fling|One Large or smaller object held or creature grappled by the kraken is thrown up to <<range 60>> in a random direction and knocked [[Prone]]. If a thrown target strikes a solid surface, the target takes <<bludgeoning "1d6 per 10'">> it was thrown. If the target is thrown at another creature, that creature must succeed on a <<save Dex 18>> or take the same damage and be knocked [[Prone]]. |<|
| !Lightning Storm|The kraken magically creates three bolts of lightning, each of which can strike a target the kraken can see within <<range 120>> of it. A target must make a <<save Dex 23>>, taking <<lightning 4d10>> on a failed save, or <<halved>> on a successful one. |<|
| !<<action>> Legendary Actions [3] |<|<|
| !Tentacle Attack or Fling|The kraken makes one tentacle attack or uses its Fling. |<|
| !Lightning Storm|''Costs 2 Actions''<br/>The kraken uses Lightning Storm. |<|
| !Ink Cloud|''Costs 3 Actions''<br/>While underwater, the kraken expels an ink cloud in a <<sphere 60>>. The cloud spreads around corners, and that area is [[Heavily Obscured]] to creatures other than the kraken. Each creature other than the kraken that ends its turn there must succeed on a <<save Con 23>>, taking <<poison 3d10>> on a failed save, or <<halved>> on a successful one. A strong current disperses the cloud, which otherwise disappears at the end of the kraken’s next turn. |<|
On initiative count 20 (losing initiative ties), the kraken takes a lair action to cause one of the following magical effects:

* ''Strong Current.''<br/>//A strong current moves through the kraken’s lair.//<br/> Each creature within <<sphere 60>> of the kraken must succeed on a <<save Str 23>> or be pushed up to <<range 60>> away from the kraken. On a success, the creature is pushed <<range 10>> away from the kraken.
* ''Lightning Vulnerability.''<br/>Creatures in the water within <<sphere 60>> of the kraken have vulnerability to <<lightning>> damage until initiative count 20 on the next round.
* ''Charged Water.''<br/>//The water in the kraken’s lair becomes electrically charged.//<br/> All creatures within <<sphere 120>> of the kraken must succeed on a <<save Con 23>>, taking <<lightning 3d6>> on a failed save, or <<halved>> on a successful one.
The region containing a kraken’s lair is warped by the creature’s blasphemous presence, creating the following magical effects:

* ''Alter Weather.'' The kraken can alter the weather at will in a 6-mile radius centered on its lair. The effect is identical to the control weather spell.
* ''Water Elementals.'' Water elementals coalesce within 6 miles of the lair. These elementals can’t leave the water and have Intelligence and Charisma scores of 1 (−5).
* ''Charmed Aquatic Creatures.'' Aquatic creatures within 6 miles of the lair that have an Intelligence score of 2 or lower are charmed by the kraken and aggressive toward intruders in the area.

When the kraken dies, all of these regional effects fade immediately.
"""
''Innate Spellcasting.'' The lamia’s innate spellcasting ability is Charisma (<<save "Spell DC" 13>>). It can innately cast the following spells, requiring no material components.
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Disguise Self]] (any humanoid form), [[Major Image]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Charm Person]], [[Mirror Image]], [[Scrying]], [[Suggestion]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day:'' [[Geas]]
"""
<<divider>>
''Multiattack.'' The lamia makes two attacks: one with its claws and one with its dagger or Intoxicating Touch.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +5>>|<<slashing 2d10+3>> |<<reach 5>> |
| !<<melee Dagger +5>>|<<piercing 1d4+3>> |<<reach 5>> |
| !<<melee "Intoxicating Touch" +5>>|Magically cursed for <<time 1h>> |<<reach 5>> |
|~|Until the curse ends, the target has <<disadvantage>> on <<save Wis>> and ''all ability checks''. |<|
''Prerequisite:'' Eldritch Blast Cantrip

Once on each of your turns when you hit a creature with your eldritch blast, you can reduce that creature’s speed by 10 feet until the end of your next turn.

Starting at 6th level for [[Circle of the Land Druids|Circle of the Land]] and 8th level for [[Rangers|Ranger]], moving through nonmagical difficult terrain costs you no extra movement. You can also pass through nonmagical plants without being slowed by them and without taking damage from them if they have thorns, spines, or a similar hazard.

In addition, you have advantage on saving throws against plants that are magically created or manipulated to impede movement, such those created by the [[Entangle]] spell.

While lit, this hooded lantern burns for <<time 6h>> on 1 pint of oil, shedding <<bright 30>> and an additional <<dim 30>>. Invisible creatures and objects are visible as long as they are in the lantern’s bright light. You can use an action to lower the hood, reducing the light to dim light in a 5-foot radius.
<div style="display: flex;">
<<stat Large 2 Objects>>
<<stat Armor 10 Class>>
<<stat Hit 50 Points>>
</div>
<div style="display: flex;">
<<ability-value Strength 14>>
<<ability-value Dexterity 10>>
<<ability-value Constitution 10>>
<<ability-value Intelligence 3>>
<<ability-value Wisdom 3>>
<<ability-value Charisma 1>>
</div>
<table>

| !<<action>> Actions |<|<|
| !<<melee Slam +6>>|<<bludgeoning 2d10+2>> |<<reach 5>> |
Your blessed touch can heal wounds. You have a pool of healing power that replenishes when you take a long rest. With that pool, you can restore a total number of hit points equal to your paladin level × 5.

As an action, you can touch a creature and draw power from the pool to restore a number of hit points to that creature, up to the maximum amount remaining in your pool.

Alternatively, you can expend 5 hit points from your pool of healing to cure the target of one disease or neutralize one poison affecting it. You can cure multiple diseases and neutralize multiple poisons with a single use of Lay on Hands, expending hit points separately for each one.

This feature has no effect on undead and constructs.

Knowledge of leatherworking extends to lore concerning animal hides and their properties. It also confers knowledge of leather armor and similar goods.

''Components.'' Leatherworker’s tools include:

* a knife
* a small mallet
* an edger
* a hole punch
* thread
* leather scraps

''Arcana.'' Your expertise in working with leather grants you added insight when you inspect magic items crafted from leather, such as boots and some cloaks.

''Investigation.'' You gain added insight when studying leather items or clues related to them, as you draw on your knowledge of leather to pick out details that others would overlook.

''Identify Hides.'' When looking at a hide or a leather item, you can determine the source of the leather and any special techniques used to treat it. For example, you can spot the difference between leather crafted using dwarven methods and leather crafted using half­ling methods.

| !Activity | !DC |
|!Modify a leather item’s appearance | 10 |
|!Determine a leather item’s history | 20 |
Name or describe a person, place, or object. The spell brings to your mind a brief summary of the significant lore about the thing you named. The lore might consist of current tales, forgotten stories, or even secret lore that has never been widely known. If the thing you named isn’t of legendary importance, you gain no information. The more information you already have about the thing, the more precise and detailed the information you receive is.

The information you learn is accurate but might be couched in figurative language. For example, if you have a mysterious magic axe on hand, the spell might yield this information: Woe to the evildoer whose hand touches the axe, for even the haft slices the hand of the evil ones. Only a true Child of Stone, lover and beloved of Moradin, may awaken the true powers of the axe, and only with the sacred word Rudnogg on the lips.
"""
''Devil's Sight.'' Magical darkness doesn't impede the lemure's darkvision.
''Hellish Rejuvenation.'' A lemure that dies in the Nine Hells comes back to life with all it's hit points in 1d10 days unless it is killed by a good·aligned creature with a [[Bless]] spell cast on that creature or its remains are sprinkled with holy water.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Fist +3>>|<<bludgeoning 1d4>> |<<reach 5>> |
You touch a creature and can end either one disease or one condition afflicting it. The condition can be [[Blinded]], [[Deafened]], [[Paralyzed]], or [[Poisoned]].
One creature or object of your choice that you can see within range rises vertically, up to 20 feet, and remains suspended there for the duration. The spell can levitate a target that weighs up to 500 pounds. An unwilling creature that succeeds on a Constitution saving throw is unaffected.

The target can move only by pushing or pulling against a fixed object or surface within reach (such as a wall or a ceiling), which allows it to move as if it were climbing. You can change the target’s altitude by up to 20 feet in either direction on your turn. If you are the target, you can move up or down as part of your move. Otherwise, you can use your action to move the target, which must remain within the spell’s range.

When the spell ends, the target floats gently to the ground if it is still aloft.
"""
''Legendary Resistance (3/Day).'' If the lich fails a saving throw, it can choose to succeed instead.
''Rejuvenation.'' If it has a phylactery, a destroyed lich gains a new body in <<time "1d10 days">>, regaining all its hit points and becoming active again. The new body appears within 5 feet of the phylactery.
''Spellcasting.'' The lich is an 18th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 20>>, <<casted +12>>). The lich has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Mage Hand]], [[Prestidigitation]], [[Ray of Frost]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Detect Magic]], [[Magic Missile]], [[Shield]], [[Thunderwave]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Detect Thoughts]], [[Invisibility]], [[Melf's Acid Arrow]], [[Mirror Image]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Animate Dead]], [[Counterspell]], [[Dispel Magic]], [[Fireball]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Blight]], [[Dimension Door]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (3 slots):'' [[Cloudkill]], [[Scrying]]
&nbsp;&nbsp;&nbsp;&nbsp;''6th level (1 slot):'' [[Disintegrate]], [[Globe of Invulnerability]]
&nbsp;&nbsp;&nbsp;&nbsp;''7th level (1 slot):'' [[Finger of Death]], [[Plane Shift]]
&nbsp;&nbsp;&nbsp;&nbsp;''8th level (1 slot):'' [[Dominate Monster]], [[Power Word Stun]]
&nbsp;&nbsp;&nbsp;&nbsp;''9th level (1 slot):'' [[Power Word Kill]]
''Turn Resistance.'' The lich has <<advantage>> on saving throws against any effect that [[Turn Undead]].
"""
<<divider>>
<<fold "Lich Lair Action">>

|max top|k
| !!<<action>> Actions |<|<|
| !<<melee "Paralyzing Touch" +12>>|<<cold 3d6>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 18>> or be [[Paralyzed]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
| !<<action>> Legendary Actions [3] |<|<|
| !Cantrip|The lich casts a cantrip. |<|
| !Paralyzing Touch|''Costs 2 Actions''<br/>The lich uses its Paralyzing Touch. |<|
| !Frightening Gaze|''Costs 2 Actions''<br/>The lich fixes its gaze on one creature it can see within <<range 10>>. The target must succeed on a <<save Wis 18>> against this magic or become [[Frightened]] for <<time 1m>>. The [[Frightened]] target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. If a target’s saving throw is successful or the effect ends for it, the target is immune to the lich’s gaze for the next <<time 24h>>. |<|
| !Disrupt Life|''Costs 3 Actions''<br/>Each non-undead creature within <<range 20>> of the lich must make a <<save Con 18>> against this magic, taking <<necrotic 6d6>> on a failed save, or <<halved>> on a successful one. |<|
On initiative count 20 (losing initiative ties), the lich can take a lair action to cause one of the following magical effects; the lich can’t use the same effect two rounds in a row:

* ''Regain Spell Slot.'' The lich <<roll 1d8>> and regains a spell slot of that level or lower. If it has no spent spell slots of that level or lower, nothing happens.
* ''Negative Energy Tether.'' The lich targets <<per 1>> it can see within <<range 30>>. A crackling cord of negative energy tethers the lich to the target. ''Whenever the lich takes damage'', the target must make a <<save Con 18>>. On a failed save, the lich takes <<halved>> (rounded down), and the target takes the remaining damage. This tether lasts until initiative count 20 on the next round or until the lich or the target is no longer in the lich’s lair.
* ''Summon Spirits.'' The lich calls forth the spirits of creatures that died in its lair. These apparitions materialize and attack <<per 1>> that the lich can see within <<range 60>>. The target must succeed on a <<save Con 18>>, taking <<necrotic 15d6>> on a failed save, or <<halved>> on a success. The apparitions then disappear.
The Life domain focuses on the vibrant positive energy — one of the fundamental forces of the universe — that sustains all life. The gods of life promote vitality and health through healing the sick and wounded, caring for those in need, and driving away the forces of death and undeath. Almost any non-evil deity can claim influence over this domain, particularly agricultural deities (such as Chauntea, Arawai, and Demeter), sun gods (such as Lathander, Pelor, and Re-Horakhty), gods of healing or endurance (such as Ilmater, Mishakal, Apollo, and Diancecht), and gods of home and community (such as Hestia, Hathor, and Boldrei). 

{{||ClericAdvancementTemplate}}
{{||ClassAbilityTemplate}}
When you choose this domain at 1st level, you gain proficiency with heavy armor.

At 8th level, you gain the ability to infuse your weapon strikes with divine energy. Once on each of your turns when you hit a creature with a weapon attack, you can cause the attack to deal an extra 1d8 radiant damage to the target. When you reach 14th level, the extra damage increases to 2d8.
At 8th level, you gain the ability to infuse your weapon strikes with divine energy. Once on each of your turns when you hit a creature with a weapon attack, you can cause the attack to deal an extra 1d8 radiant damage to the target. When you reach 14th level, the extra damage increases to 2d8.
| !Cleric Level | !Spells |
| !1st |[[Bless]], [[Cure Wounds]] |
| !3rd |[[Lesser Restoration]], [[Spiritual Weapon]] |
| !5th |[[Beacon of Hope]], [[Revivify]] |
| !7th |[[Death Ward]], [[Guardian of Faith]] |
| !9th |[[Mass Cure Wounds]], [[Raise Dead]] |

''Prerequisite:'' 12th level, Pact of the Blade feature

When you hit a creature with your pact weapon, the creature takes extra necrotic damage equal to your Charisma modifier (minimum 1).
You touch one object that is no larger than 10 feet in any dimension. Until the spell ends, the object sheds bright light in a 20-foot radius and dim light for an additional 20 feet. The light can be colored as you like. Completely covering the object with something opaque blocks the light. The spell ends if you cast it again or dismiss it as an action.

If you target an object held or worn by a hostile creature, that creature must succeed on a Dexterity saving throw to avoid the spell.
The presence or absence of light in an environment creates three categories of illumination: bright light, dim light, and darkness.

|^!{{Light, Bright||Link}} |{{Light, Bright}} |
|^!{{Light, Dim||Link}} |{{Light, Dim}} |
|^!{{Light, Darkness||Link}} |{{Light, Darkness}} |
''Bright light'' lets most creatures see normally. Even gloomy days provide bright light, as do torches, lanterns, fires, and other sources of illumination within a specific radius.
''Darkness'' creates a [[Heavily Obscured]] area. Characters face darkness outdoors at night (even most moonlit nights), within the confines of an unlit dungeon or a subterranean vault, or in an area of magical darkness.
''Dim light'', also called shadows, creates a lightly obscured area. An area of dim light is usually a boundary between a source of bright light, such as a torch, and surrounding darkness. The soft light of twilight and dawn also counts as dim light. A particularly brilliant full moon might bathe the land in dim light.
As a lightfoot halfling, you can easily hide from notice, even using other people as cover. You’re inclined to be affable and get along well with others. In the Forgotten Realms, lightfoot halflings have spread the farthest and thus are the most common variety.

Lightfoots are more prone to wanderlust than other halflings, and often dwell alongside other races or take up a nomadic life. In the world of Greyhawk, these halflings are called hairfeet or tallfellows.

|^!Ability Score Increase |^Your Charisma score increases by 1. |
|^![[Naturally Stealthy]] |^{{Naturally Stealthy}} |
A given area might be lightly or heavily obscured. In a ''lightly obscured'' area, such as dim light, patchy fog, or moderate foliage, creatures have disadvantage on Wisdom (Perception) checks that rely on sight.

A stroke of lightning forming a line of 100 feet long and 5 feet wide blasts out from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 8d6 lightning damage on a failed save, or half as much damage on a successful one.

The lightning ignites flammable objects in the area that aren’t being worn or carried.
<strong><$link to={{!!title}}><$transclude field="caption"><$view field="title" /></$transclude></$link></strong>
"""
''Keen Smell.'' The lion has advantage on Wisdom (Perception) checks that rely on smell.
''Pack Tactics.'' The lion has advantage on an attack roll against a creature if at least one of the lion's allies is within 5 feet of the creature and the ally isn't [[Incapacitated]].
''Pounce.'' If the lion moves at least 20 feet straight toward a creature and then hits it with a claw attack on the same turn, that target must succeed on a <<save Str 13>> or be knocked [[Prone]]. If the target is prone, the lion can make one bite attack against it as a bonus action.
''Running Leap.'' With a 10-foot running start, the lion can long jump up to 25 feet.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d8+3>> |<<reach 5>> |
| !<<melee Claw +5>>|<<slashing 1d6+3>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite 0>>|<<piercing 1>> |<<reach 5>> |
"""
''Hold Breath.'' The lizardfolk can hold its breath for 15 minutes.
"""
<<divider>>
''Multiattack.'' The lizardfolk makes two melee attacks, each one with a different weapon.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<melee "Heavy Club" +4>>|<<bludgeoning 1d6+2>> |<<reach 5>> |
| !<<ranged Javelin +4>>|<<piercing 1d6+2>> |<<reach 5>><br/><<range 30/120>> |
| !<<melee "Spiked Shield" +4>>|<<piercing 1d6+2>> |<<reach 5>> |
Some trolls have the following trait.

"""
''Loathsome Limbs.'' Whenever the troll takes at least <<slashing 15>> at one time, roll a d20 to determine what else happens to it:
&nbsp;&nbsp;&nbsp;&nbsp;''1–10:'' Nothing else happens.
&nbsp;&nbsp;&nbsp;&nbsp;''11–14:'' One leg is severed from the troll if it has any legs left.
&nbsp;&nbsp;&nbsp;&nbsp;''15–18:'' One arm is severed from the troll if it has any arms left.
&nbsp;&nbsp;&nbsp;&nbsp;''19–20:'' The troll is decapitated, but the troll dies only if it can’t regenerate. If it dies, so does the severed head.

If the troll finishes a short or long rest without reattaching a severed limb or head, the part regrows. At that point, the severed part dies. Until then, a severed part acts on the troll’s initiative and has its own action and movement. 

A severed part has <<ac 13>>, <<hp 10>>, and the troll’s Regeneration trait.

A severed leg is unable to attack and has a speed of 5 feet.

A severed arm has a speed of 5 feet and can make one claw attack on its turn, with disadvantage on the attack roll unless the troll can see the arm and its target. Each time the troll loses an arm, it loses a claw attack.

If its head is severed, the troll loses its bite attack and its body is blinded unless the head can see it. The severed head has a speed of 0 feet and the troll’s Keen Smell trait. It can make a bite attack but only against a target in its space.

The troll’s speed is halved if it’s missing a leg. If it loses both legs, it falls prone. If it has both arms, it can crawl. With only one arm, it can still crawl, but its speed is halved. With no arms or legs, its speed is 0, and it can’t benefit from bonuses to speed.
"""
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5Sg2ovt3Lz7D4biSD7ZiaZVybbuC8ecSteojOf6rtv+n+EJh8RiAohMaozMpvOjjEqf1KpVisVat9xc9pvtischsDlMTqsZ5zZ6DR+75++43UnP1+98nv6v1ScoA1g4NYjIYrgYlegIxRiZ9EhJIXmJVKmpgNmZubnpKfoDWjl6alPqiMpaoyrYGqvyaidrm0K7drt7kkvGC4zh2xVcvDRMZawMgPy0vNzM9PwcXTRNXe13jZ2Nsz3d7f0NHv4yvl3uco6eTrLO3l72Dh/fMT9e73GPnz+xz98Pwr9zAQUO/FbQwUGCCRcsZNjwwEOIEQNMpJjwIsb+gho35nvXYF5EehsQcuQmglxAZTBQxjPmBWa/YtqAzbRJJNhHXtJ41tvlzGc6oFWIDrXF5dZLWWKUlkMqh+nTWGqkhqNaFWs3q2m4RtOqq9VVVnzEbkXVx2w1tXfYIiMLC+5XtIPkNqNbF+/dU6v4rvWLyK4vvXkBDyNcWNTcUZQQ0zKcyPEryJEZ71VsyvJbzY8oP8acGfRh0Z05DybdF/VnT6BM53KdutNi2aFUT7YdGHcp2JVZX6atibcq4XF1tzZelvhx36GZj0ZeS3lt6HE836YOx/pw6dW17/YenXtz57nFNwafXfJ29FnZB3f/C/544MXNz6efXP55/Vf+BD/nn4x//2HXn4CnqRcVgqspuAVYfzFYlIOzATgEVGe5RYyEE0JohIVjaRiUV9k4VaCID5rYIYlHeZiiUSuqWCFO7eiUk4xL2SgOjT/RlCOPO8qkDjQruQTCNScZqY9JN62jEEgZdeTRjVCStNOUSDZk5ZVPZikkllyyVJFFX/o40pg4emmmixWlCeOabKKI5psc/iinfXTWiV+YBuBJYJV8XqInG39KEqiggzJSqKGHApKooovq0aijj84RqUOT5lGppZdSmiknm7bRqaafghGqqKMeUuoRp+6R6p6rNtKqp69OEquss/pQq6m30pCrrrv20qutv94QrLDDXlD+rK/HMpOsscc2q+yu0Er667TRvmottbNme+2o3Gp76rfdXiouuJuWO+6i6Jr76Lrp/ukuu/DGKy+e9NYr570hnavvu2n2u2+7APv75cABz2swwVYmfHCdDDdp78P4QikxxG9W3LCZGFs85sYm/OtxxguHzPGUJH/M5ckom6xyyRq1vPLLMMf80MwGyWyzy//kHMFFPN980M89By000PsUPfTRSCft5NJGR+m0s1pGTfPUVItM5NVYA6k101l3PTGIYIc959iugmm2JVyn7bWabLfN4ttPwyn31hTK7XbdcN9dN916z03e3yUZKLjafRYudSSIyxP44jPk6bg9mERwPgKglKek+OWVI6r55oV07s7noIf+x+gllG766XSkrsjqrKsO6uutmyF7C7HXDjuruGMeyO629+577rQG//vwxBdPyvEtAaH88rg27zyv0MeQyvTUz2I9IcRmf30Q3Pd4zPfdryB+TMyWnyP6PUxbAAA7
Describe or name a specific kind of beast or plant. Concentrating on the voice of nature in your surroundings, you learn the direction and distance to the closest creature or plant of that kind within 5 miles, if any are present.
Describe or name a creature that is familiar to you. You sense the direction to the creature’s location, as long as that creature is within 1,000 feet of you. If the creature is moving, you know the direction of its movement.

The spell can locate a specific creature known to you, or the nearest creature of a specific kind (such as a human or a unicorn), so long as you have seen such a creature up close – within 30 feet – at least once. If the creature you described or named is in a different form, such as being under the effects of a polymorph spell, this spell doesn’t locate the creature.

This spell can’t locate a creature if running water at least 10 feet wide blocks a direct path between you and the creature.
Describe or name an object that is familiar to you. You sense the direction to the object’s location, as long as that object is within 1,000 feet of you. If the object is in motion, you know the direction of its movement.

The spell can locate a specific object known to you, as long as you have seen it up close – within 30 feet – at least once. Alternatively, the spell can locate the nearest object of a particular kind, such as a certain kind of apparel, jewelry, furniture, tool, or weapon.

This spell can’t locate an object if any thickness of lead, even a thin sheet, blocks a direct path between you and the object.
<<list-icons "[tag[Location]sort[]]" "0 locations found.">>
"""
''Mechanical Trap''
"""
This pit trap is identical to a [[Hidden Pit]] trap, with one key exception: the trap door that covers the pit is spring-loaded. After a creature falls into the pit, the cover snaps shut to trap its victim inside.

|max top|k
|!Detection |<<perception 15>> to discern an absence of foot traffic over the section of floor that forms the pit's cover.<br/>A successful <<investigation 15>> is necessary to confirm that the trapped section of floor is actually the cover of a pit. |
|!Trigger |Stepping on the cover. |
|!Effect |Cover swings open like a trapdoor, causing target to spill into the pit below. Target takes falling damage based on the pit's depth. |
|!Countermeasure #1 |Wedging an iron spike or similar item between the pit's cover and the floor in such a way that prevent the cover from opening,. |
|!Countermeasure #2 |Cover can be magically held shut using [[Arcane Lock]] or similar spell. |

* ''Opening the cover from pit.''
** <<skillcheck Str 20>> to pry open the cover.
** <<thievestools 15>> to disable spring mechanism, provided target can see and reach the mechanism.
<div class="icon"><$link to={{!!title}}><$list filter="[all[current]has[icon]]"><$image source={{!!icon}} width=100 /><br/></$list><$list filter="[all[current]has[caption]]"><$view field=caption /></$list><$list filter="[all[current]!has[caption]]"><$view field=title /></$list></$link><$list filter="[all[current]has[level]]"><br/>//level <$view field=level />//</$list></div>
|max top|k
| !d100 | !Effect (lasts <<time "1d10 × 10 hours">>) |
| !01–10 |The character feels compelled to repeat a specific activity over and over, such as washing hands, touching things, praying, or counting coins. |
| !11–20 |The character experiences vivid hallucinations and has disadvantage on ability checks. |
| !21–30 |The character suffers extreme paranoia. The character has disadvantage on Wisdom and Charisma checks. |
| !31–40 |The character regards something (usually the source of madness) with intense revulsion, as if affected by the antipathy effect of the [[Antipathy/Sympathy]] spell. |
| !41–45 |The character experiences a powerful delusion. Choose a potion. The character imagines that he or she is under its effects. |
| !46–55 |The character becomes attached to a “lucky charm,” such as a person or an object, and has disadvantage on attack rolls, ability checks, and saving throws while more than 30 feet from it. |
| !56–65 |The character is [[Blinded]] (25%) or [[Deafened]] (75%). |
| !66–75 |The character experiences uncontrollable tremors or tics, which impose disadvantage on attack rolls, ability checks, and saving throws that involve Strength or Dexterity. |
| !76–85 |The character suffers from partial amnesia. The character knows who he or she is and retains racial traits and class features, but doesn’t recognize other people or remember anything that happened before the madness took effect. |
| !86–90 |Whenever the character takes damage, he or she must succeed on a DC 15 Wisdom saving throw or be affected as though he or she failed a saving throw against the [[Confusion]] spell. The confusion effect lasts for 1 minute. |
| !91–95 |The character loses the ability to speak. |
| !96–100 |The character falls [[Unconscious]]. No amount of jostling or damage can wake the character. |
You touch a creature. The target’s speed increases by 10 feet until the spell ends.
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yudwYIi8fksvmMTqvLmLX7DY+HvwG5/S7X4Pf8M70P2McRSHhHV1eYuAYx96D4iHaICEnZ6AgQUakpqVnJKPbZ+Sg5KUoYCnppetqAyWS5sMrq4Kcqy0frqgSrcCtoywbsG3e5NJY7nIcaLJy82JqKdAztDLdsdl2dhqxrRNaszUytlh3+Pc4rhI1ufs79/N4+zbBOVB8rL06vHJ/fXxSJXbty8ASa65euxzaD4QiSA9eQYTcfC/flm4gPj0P+ZwgT6ijYyx9EayOHdYym8KHFgyVJnvT1EmMONzFXbeQnUVZNmTZcZqyWqVBQbTt50vAZkmhLOzdFFd2BM2mypoaWesqp72jUBECtavQ6CmtWGUzFQqKKC2yioijBVF1pE+2eoTrNjn3xFa4puWnZzvpJTOtbwE7V/vJ7mHDgGImlduIbCPJcu7VgNOa61/BfvZQQu3MByHNZ0ZsVKyI9j0VpBIVRh9a8lXXkFqsPPIa9Fvcb121R5OZcWzZL3gGB503x2/Rr4kJ1V1Q++MRpykihc3R+z/Fs6WGNH6eeGftn7dtLnAWvEn149cWtfxfRmX1290qZGy01fcQm+an+vcuTPJ9w58F3lX+7ibeegTTxl94HtynYIITDuWZfex60Rt9zEg7kXIWVXYghedWJeNFdAsZmW4J6xLVhfxmWeJ8B75243yAsvugiiTAGiBmKMt6YwS2IAXgRXx6CZIFJ1BEpkl9HIkmBkhsyWSRYT0Y4wVR2UVkiVVdCSZeQYnEJY1NfYknmjClqiOOOFlqHYHRpqvnjm226yWOPeeInZZh96jjnjg6duaCff+o53p142olobzRqGedljwa6aDaEjtjodXpRumiMfF56IIPNwWVop31xAyqmdXK4EqemopJqqDpCmpGrpnrq0Zr/zUprSLbeimusi+na5AXA1mj+bJmPsprkschG6SaxVSbrbHzNRsvntNBWW+C2gnZ6LbfdlqotKeaei2666q7LbrvuvgtvvPLOS2+99t6Lb77n3iqsuLmuiueyXYrq77C87iqtoAQXXKiih2Y7cIsM0wlxxAfX5/DEBmdqccZAcqxxcBUjvLC1HofMpsDFltzdySh/eHFX5DIb88uy1vxwvxurbLOPI0+YJbYS97xnwNQqOzTROSa8srflgqx0wziLGaTCSUet881tIO3yy1lLveLTPEcNM9Qyd2B11yF/jWbVYjNNdtlj9wpi03PH/S/XIXRsNt736U0gyVP3zLbce78NsN+J3l0Xd4L3TXbhex7+TjPkWLMsqQl2w4235Es7HtHVDHvuKHKVM24z6f+CjvHgo6vuVuhqHwu7YGe7XjDpNwBt+dqYy0mW7LhzqzsOvKP+uugiM9Z678nPPhlUtzuf++87Gz898sQXHkT2nPuufOYfaQp92sMvB4T3iXttvdY/kH9+pe2D+X7O31cfPsX1wzS/+j+PCxD7/U9cXzOGAAmXtSYcMHX9M9wR+Jc/xA0wP06AYPmapz30VZBqF/SfAJPAwfhtbn3PgkIIqSe0DqbMhB/LIOBcqL8NqgiGI5xgeazQOBXmUISqkkIL7weuBpauCj8kIb+EuDoqzBCIKeQh/bAQIhTWcIlaoKL+DSVYxCo+SIclpGEPt7BFJ57Qi2A7RBiliEEmnmpfACSjBcU4uS+c0Y1ZjCIbTQbHLqoxhmbEIxrpRkcHoquNe/QgIdflx0Dq0YgahNeAuDgqFdorkYVc4CPndck/1jGTmKRgHpPzSU+9q2WhvKEmGVUvT55ykVd0371IuUpOVrKM+FKlIiOZR31BT3WLm+UKdQnKWAbzlrq0Dy/zhstiCvNvUxymMn1ZtMcp8pkI4qUxqSmeSEVvdticWQ9PB81edjOWxYvgOL3pSkZacXnnDCcyDSm+dp6Pe7yRp9NGA8lftjKO9vQi2+rZz6BRDH6rDGgF1rjM66nziQa9WgL+5dPQo/nsjZqMqEQVus94ItSi6BTkGGHI0a3hs5QmymgSQ4qeWIkGpWH75jqBx1KBYvSlI43pQSdqx1nadAM4ZSVMd3rPtpnUpRgFqkyfOMdCGrVutFzoNnG2VKYilZJO/VxUb9rUoQrVZ1fF6lRtuceugiCdWkWlDcVKOX3CknFoTatanVlVUbY1qCUFa1XnGjizwnWCeNXPVkWW1b62NJqNnJtgSfDVjQLxsIh9q0aFylie6vWx+oysjTyqWHValnVWpSw/NzvYzj7VbKDl7BCHepLS+oawPf2saiUrTpN25LUqYC1RY0vbsda1tbjNrYN2e1ur+tatzAzuSYeI+9vTzrSkyPWrcsnK3Obmtbh/7a1007qTeFwXNM+t7nG3S7mYvAO8lomRd8lbXuqyFr3lTe042Mu82VIDvmRBSDHoywPM4pcidd0vf0Xr35R0NsD//S6BZ3LaA+9PwdKQK4PH92BpRHjCFK6whS+M4QxreMMc7rCHPwziEIt4xCQusYlPfK8CAAA7
When you join the College of Lore at 3rd level, you gain proficiency with three skills of your choice.
You gain a +1 bonus to attack and damage rolls made with this magic weapon. While the sword is on your person, you also gain a +1 bonus to saving throws.

''Luck.'' If the sword is on your person, you can call on its luck (no action required) to reroll one attack roll, ability check, or saving throw you dislike. You must use the second roll. This property can’t be used again until the next dawn.

''Wish.'' The sword has <<roll 1d4-1>> charges. While holding it, you can use an action to expend 1 charge and cast the [[Wish]] spell from it. This property can’t be used again until the next dawn. The sword loses this property if it has no charges.
A humanoid creature can be afflicted with the curse of lycanthropy after being wounded by a lycanthrope, or if one or both of its parents are lycanthropes. A [[Remove Curse]] spell can rid an afflicted lycanthrope of the curse, but a natural born lycanthrope can be freed of the curse only with a [[Wish]].

A lycanthrope can either resist its curse or embrace it. By resisting the curse, a lycanthrope retains its normal alignment and personality while in humanoid form. It lives its life as it always has, burying deep the bestial urges raging inside it. However, when the full moon rises, the curse becomes too strong to resist, transforming the individual into its beast form — or into a horrible hybrid form that combines animal and humanoid traits. When the moon wanes, the beast within can be controlled once again. Especially if the cursed creature is unaware of its condition, it might not remember the events of its transformation, though those memories often haunt a lycanthrope as bloody dreams.

Some individuals see little point in fighting the curse and accept what they are. With time and experience, they learn to master their shapechanging ability and can assume beast form or hybrid form at will. Most lycanthropes that embrace their bestial natures succumb to bloodlust, becoming evil, opportunistic creatures that prey on the weak.
When you hit a fiend or an undead with this magic weapon, that creature takes an extra <<radiant 2d6>>. If the target has <<hp "&le;25">> after taking this damage, it must succeed on a <<save Wis 15>> or be destroyed. On a successful save, the creature becomes [[Frightened]] of you until the end of your next turn.

While you hold this weapon, it sheds <<bright 20>> and an additional <<dim 20>>.
You gain a +1 bonus to attack and damage rolls made with this magic weapon. The bonus increases to +3 when you use the mace to attack a construct.

When you roll a 20 on an attack roll made with this weapon, the target takes an extra <<bludgeoning 7>>, or <<bludgeoning 14>> if it’s a construct. If a construct has <<hp "&le;25">> after taking this damage, it is destroyed.
This magic weapon has 3 charges. While holding it, you can use an action and expend 1 charge to release a wave of terror. Each creature of your choice in a 30-foot radius extending from you must succeed on a <<save Wis 15>> or become [[Frightened]] of you for <<time 1m>>. While it is frightened in this way, a creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If it has nowhere it can move, the creature can use the Dodge action. At the end of each of its turns, a creature can repeat the saving throw, ending the effect on itself on a success.

The mace regains <<roll 1d3>> expended charges daily at dawn.
<<vtabs "[tag[Macro]sort[]]">>
''Prerequisite:'' 5th level, hex spell or a warlock feature that curses

As a bonus action, you cause a psychic disturbance around the target cursed by your hex spell or by a warlock feature of yours, such as Hexblade’s Curse or Sign of Ill Omen. When you do so, you deal psychic damage to the cursed target and each creature of your choice that you can see within 5 feet of it. The psychic damage equals your Charisma modifier (minimum of 1 damage). To use this invocation, you must be able to see the cursed target, and it must be within 30 feet of you.

!! Curing Madness

A [[Calm Emotions]] spell can suppress the effects of madness, while a [[Lesser Restoration]] spell can rid a character of a ''short-term or long-term madness.'' 

Depending on the source of the madness, [[Remove Curse]] or [[Dispel Evil and Good]] might also prove effective. A [[Greater Restoration]] spell or more powerful magic is required to rid a character of ''indefinite madness''.

<<vtabs "[tag[Madness]sort[order]]">>
"""
Spellcasting. The mage is a 9th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 14>>, <<casted "Spell Attack"+6>>). The mage has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Fire Bolt]], [[Light]], [[Mage Hand]], [[Prestidigitation]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Detect Magic]], [[Mage Armor]], [[Magic Missile]], [[Shield]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Misty Step]], [[Suggestion]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Counterspell]], [[Fireball]], [[Fly]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Greater Invisibility]], [[Ice Storm]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (1 slot):'' [[Cone of Cold]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Dagger +5>>|<<piercing 1d4+2>> |<<reach 5>><br/><<range 20/60>> |
You touch a willing creature who isn’t wearing armor, and a protective magical force surrounds it until the spell ends. The target’s base AC becomes 13 + its Dexterity modifier. The spell ends it if the target dons armor or if you dismiss the spell as an action.
A spectral, floating hand appears at a point you choose within range.
The hand lasts for the duration or until you dismiss it as an action. The hand vanishes if it is ever more than 30 feet away from you or if you cast this spell again.

You can use your action to control the hand. You can use the hand to manipulate an object, open an unlocked door or container, stow or retrieve an item from an open container, or pour the contents out of a vial. You can move the hand up to 30 feet each time you use it.

The hand can’t attack, activate magical items, or carry more than 10 pounds.
<<list-box "[tag[Magic Item]tag[Armor]sort[]]" "No magical armor found.">>
You create a 10-foot-radius, 20-foot-tall cylinder of magical energy centered on a point on the ground that you can see within range. Glowing runes appear wherever the cylinder intersects with the floor or other surface.

Choose one or more of the following types of creatures: celestials, elementals, fey, fiends, or undead. The circle affects a creature of the chosen type in the following ways:

* The creature can’t willingly enter the cylinder by nonmagical means. If the creature tries to use teleportation or interplanar travel to do so, it must first succeed on a Charisma saving throw.
* The creature has disadvantage on attack rolls against targets within the cylinder.
* Targets within the cylinder can’t be [[Charmed]], [[Frightened]], or possessed by the creature.

When you cast this spell, you can elect to cause its magic to operate in the reverse direction, preventing a creature of the specified type from leaving the cylinder and protecting targets outside it.
Magic items are gleaned from the hoards of conquered monsters or discovered in long &mdash; lost vaults. Such items grant capabilities a character could rarely have otherwise, or they complement their owner’s capabilities in wondrous ways.
<<list-box "[tag[Magic Item]sort[]]" "No magic items found.">>
Your body falls into a catatonic state as your soul leaves it and enters the container you used for the spell’s material component. While your soul inhabits the container, you are aware of your surroundings as if you were in the container’s space. You can’t move or use reactions. The only action you can take is to project your soul up to 100 feet out of the container, either returning to your living body (and ending the spell) or attempting to possess a humanoids body.

You can attempt to possess any humanoid within 100 feet of you that you can see (creatures warded by a protection from evil and good or magic circle spells can’t be possessed). The target must make a Charisma saving throw. On a failure, your soul moves into the target’s body, and the target’s soul becomes trapped in the container. On a success, the target resists your efforts to possess it, and you can’t attempt to possess it again for 24 hours.

Once you possess a creature’s body, you control it. Your game statistics are replaced by the statistics of the creature though you retain your alignment and your Intelligence, Wisom, and Charisma scores. You retain the benefit of your own class feature. If the target has any class levels, you can’t use any of its class features.

Meanwhile, the possessed creature’s soul can perceive from the container using its own senses, but it can’t move or take actions at all.

While possessing a body, you can use your action to return from the host body to the container if it is within 100 feet of you, returning the host creature’s soul to its body. If the host body dies while you’re in it, the creature dies, and you must make a Charisma saving throw against your own spellcasting DC. On a success, you return to the container if it is within 100 feet of you. Otherwise, you die.

If the container is destroyed or the spell ends, your soul immediately returns to your body. If your body is more than 100 feet away from you, or if your body is dead when you attempt to return to it, you die. If another creature’s soul is in the container when it is destroyed, the creature’s soul returns to its body if the body is alive and within 100 feet. Otherwise, that creature dies.

When the spell ends, the container is destroyed.
You create three glowing darts of magical force. Each dart hits a creature of your choice that you can see within range. A dart deals 1d4 + 1 force damage to its target. The darts all strike simultaneously and you can direct them to hit one creature or several.
You implant a message within an object in range, a message that is uttered when a trigger condition is met.
Choose an object that you can see and that isn’t being worn or carried by another creature. Then speak the message, which must be 25 words or less, though it can be delivered over as long as 10 minutes. Finally, determine the circumstance that will trigger the spell to deliver your message.

When that circumstance occurs, a magical mouth appears on the object and recites the message in your voice and at the same volume you spoke. If the object you chose has a mouth or something that looks like a mouth (for example, the mouth of a statue), the magical mouth appears there so that words appear to come from the object’s mouth. When you cast this spell, you can have the spell end after it delivers its message, or it can remain and repeats its message whenever the trigger occurs.

The triggering circumstance can be as general or as detailed as you like, though it must be based on visual or audible conditions that occur within 30 feet of the object. For example, you could instruct the mouth to speak when any creature moves within 30 feet of the object or when a silver bell rings within 30 feet of it.
<<list-box "[tag[Magic Item]tag[Potion]sort[]]" "No potions found.">>
<<list-box "[tag[Magic Item]tag[Rod]sort[]]" "No magical rods found.">>
<<list-box "[tag[Magic Item]tag[Staff]sort[]]" "No magical staffs found.">>
<<list-box "[tag[Magic Item]tag[Wand]sort[]]" "No magical wands found.">>
You touch a nonmagical weapon. Until the spell ends, that weapon becomes a magic weapon with a +1 bonus to attack rolls and damage rolls.
<<list-box "[tag[Magic Item]tag[Weapon]sort[]]" "No magical weapons found.">>
"""
''Optional Class Feature''
"""

You can tap into your inner wellspring of magic to try to conjure success from failure. When you make an ability check that fails, you can spend 1 sorcery point to reroll the d20, and you must use the new roll, potentially turning the failure into a success.
"""
''Optional Class Feature''
"""

If a creature has a Bardic Inspiration die from you and casts a spell that restores hit points or deals damage, the creature can roll that die and choose a target affected by the spell. Add the number rolled as a bonus to the hit points regained or the damage dealt. The Bardic Inspiration die is then lost.
By 10th level, you have plundered magical knowledge from a wide spectrum of disciplines. Choose two spells from any classes, including this one. A spell you choose must be of a level you can cast, as shown on the Bard table, or a cantrip.

The chosen spells count as bard spells for you and are included in the number in the Spells Known column of the Bard table.

You learn two additional spells from any classes at 14th level and again at 18th level.
{{Magical Secrets}}
{{Magical Secrets}}
"""
''Death Burst.'' When the mephit dies, it explodes in a burst of lava. Each creature within <<sphere 5>> of it must make a <<save Dex 11>>, taking <fail><<fire 2d6>></fail>, or <pass><<halved>></pass> on a successful one.
''False Appearance.'' While the mephit remains motionless, it is indistinguishable from an ordinary mound of magma.
''Innate Spellcasting (1/Day).'' The mephit can innately cast [[Heat Metal]] (<<save DC 10>>), requiring no material components. Its innate spellcasting ability is Charisma.
"""

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +3>>|<<slashing 1d4+1>> + <<fire 1d4>> |<<reach 5>> |
| !Fire Breath|''Recharge 6.''<br/>The mephit exhales a <<cone 15>> of fire. Each creature in that area must make a <<save Dex 11>>, taking <fail><<fire 2d6>></fail>, or <pass><<halved>></pass>. |<|
"""
''Death Burst.'' When the magmin dies, it explodes in a burst of fire and magma. Each creature within <<sphere 10>> must make a <<save Dex 11>>, taking <fail> <<fire 2d6>></fail>, or <pass> <<halved>></pass>. Flammable objects that aren’t being worn or carried in that area are ignited.
''Ignited Illumination.'' As a bonus action, the magmin can set itself ablaze or extinguish its flames. While ablaze, the magmin sheds <<bright 10>> and an additional <<dim 10>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Touch +4>>|<<fire 2d6>> |<<reach 5>> |
|~|If the target is a creature or a flammable object, it ignites. Until a creature takes an action to douse the fire, the creature takes <<fire 1d6>> at the end of each of its turns. |<|
You conjure an extradimensional dwelling in range that lasts for the duration. You choose where its one entrance is located. The entrance shimmers faintly and is 5 feet wide and 10 feet tall. You and any creature you designate when you cast the spell can enter the extradimensional dwelling as long as the portal remains open. You can open or close the portal if you are within 30 feet of it. While closed, the portal is invisible.

Beyond the portal is a magnificent foyer with numerous chambers beyond. The atmosphere is clean, fresh, and warm.

You can create any floor plan you like, but the space can’t exceed 50 cubes, each cube being 10 feet on each side. The place is furnished and decorated as you choose. It contains sufficient food to serve a nine-course banquet for up to 100 people. A staff of 100 near-transparent servants attends all who enter. You decide the visual appearance of these servants and their attire. They are completely obedient to your orders. Each servant can perform any task a normal human servant could perform, but they can’t attack or take any action that would directly harm another creature. Thus the servants can fetch things, clean, mend, fold clothes, light fires, serve food, pour wine, and so on. The servants can go anywhere in the mansion but can’t leave it. Furnishings and other objects created by this spell dissipate into smoke if removed from the mansion. When the spell ends, any creatures inside the extradimensional space are expelled into the open spaces nearest to the entrance.
<<fold README>>

<<list-icons "[tag[MainPage]sort[order]]">>
<<htabs "[[Character]] [[Adventure]] [[Class]] [[Spell]] [[AdvancedSearch]]" Character>>
You create the image of an object, a creature, or some other visible phenomenon that is no larger than a 20-foot cube.
The image appears at a spot that you can see within range and lasts for the duration. It seems completely real, including sounds, smells, and temperature appropriate to the thing depicted. You can’t create sufficient heat or cold to cause damage, a sound loud enough to deal thunder damage or deafen a creature, or a smell that might sicken a creature (like a troglodyte’s stench).

As long as you are within range of the illusion, you can use your action to cause the image to move to any other spot within range. As the image changes location, you can alter its appearance so that its movements appear natural for the image. For example, if you create an image of a creature and move it, you can alter the image so that it appears to be walking. Similarly, you can cause the illusion to make different sounds at different times, even making it carry on a conversation, for example.

Physical interaction with the image reveals it to be an illusion, because things can pass through it. A creature that uses its action to examine the image can determine that it is an illusion with a successful Intelligence (Investigation) check against your spell save DC. If a creature discerns the illusion for what it is, the creature can see through the image, and its other sensory qualities become faint to the creature.&nbsp;
"""
''Price per Dose:'' 250 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 15>> or become [[Poisoned]] for <<time 1h>>. 
** The poisoned creature is [[Blinded]].
"""
''Trampling Charge.'' If the mammoth moves at least 20 feet straight toward a creature and then hits it with a gore attack on the same turn , that target must succeed on a <<save Str 18>> or be knocked prone. If the target is [[Prone]], the mammoth can make one stomp attack against it as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Gore +10>>|<<piercing 4d8+7>> |<<reach 10>> |
| !<<melee Stomp +10>>|<<bludgeoning 4d10+7>> |<<reach 5>> |
"""
''Tail Spike Regrowth.'' The manticore has twenty-four tail spikes. Used spikes regrow when the manticore finishes a long rest.
"""
<<divider>>
''Multiattack.'' The manticore makes three attacks: one with its bite and two with its claws or three with its tail spikes.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d8+3>> |<<reach 5>> |
| !<<melee Claw +5>>|<<slashing 1d6+3>> |<<reach 5>> |
| !<<ranged "Tail Spike" +5>>|<<piercing 1d8+3>> |<<range 100/200>> |
You have advantage on saving throws against spells while you wear this cloak.
This book contains health and diet tips, and its words are charged with magic. If you spend <<time 48h>> over a period of <<time "&le;6d">> studying the book’s contents and practicing its guidelines, your Constitution score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
This book describes fitness exercises, and its words are charged with magic. If you spend <<time 48h>>  over a period of <<time "&le;6d">> studying the book’s contents and practicing its guidelines, your Strength score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
This tome contains information and incantations necessary to make a particular type of golem. To decipher and use the manual, you must be a spellcaster with at least two 5th-level spell slots. A creature that can't use a manual of golems and attempts to read it takes <<psychic 6d6>>.

| !d20 | !Golem | !Time | !Cost |
| !1-5 |Clay | 30 days | 65,000 GP |
| !6-17 |Flesh | 60 days | 50,000 GP |
| !18 |Iron | 120 days | 100,000 GP |
| !19-20 |Stone | 90 days | 80,000 GP |
 
To create a golem, you must spend the time shown on the table, working without interruption with the manual at hand and resting no more than <<time 8h>> per day. You must also pay the specified cost to purchase supplies.

Once you finish creating the golem, the book is consumed in eldritch flames. The golem becomes animate when the ashes of the manual are sprinkled on it. It is under your control, and it understands and obeys your spoken commands.
This book contains coordination and balance exercises, and its words are charged with magic. If you spend <<time 48>> over a period of <<time "&le;6d">> studying the book's contents and practicing its guidelines, your Dexterity score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
"""
''Magic Resistance.'' The marilith has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The marilith’s weapon attacks are magical.
''Reactive.'' The marilith can take one reaction on every turn in a combat.
"""
<<divider>>
''Multiattack.'' The marilith makes seven attacks: six with its longswords and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +9>>|<<slashing 2d8+4>> |<<reach 5>> |
| !<<melee Tail +9>>|<<bludgeoning 2d10+4>> |<<reach 10>> |
|~|If the target is Medium or smaller, it is [[Grappled]], <<skillcheck Escape 19>>. Until this grapple ends, the target is [[Restrained]], the marilith can automatically hit the target with its tail, and the marilith can’t make tail attacks against other targets. |<|
| !Teleport|The marilith magically teleports, along with any equipment it is wearing or carrying, up to <<range 120>> to an unoccupied space it can see. |<|
| !<<reaction>> Reactions |<|<|
| !Parry|The marilith adds <<ac +5>> against one melee attack that would hit it. To do so, the marilith must see the attacker and be wielding a melee weapon. |<|
\define mark(label, data)
\whitespace trim
  <div class="mark" title="$label$ $data$">
    <span class="label">$label$</span>
    <span class="data">$data$</span>
  </div>
\end

\define mark-dice(icon, color, dice)
\whitespace trim
<div class="mark" title="$icon$ $dice$">
  <span class="label clean $color$"><span class="icon-$icon$"/></span>
  <span class="data clean $color$"><$macrocall $name="dnd.average" expr="$dice$"/></span>
</div>
\end

\define mark-icon(icon, label, value)
\whitespace trim
<div class="mark" title="$icon$ $value$">
  <span class="label"><span class="icon-$icon$">$label$</span></span>
  <span class="data ">$value$</span>
</div>
\end

\define entity(icon, label, value)
\whitespace trim
<div class="mark" title="$icon$ $value$">
  <span class="label entity clean"><span class="icon-$icon$">$label$</span></span>
  <span class="data entity clean">$value$</span>
</div>
\end

\define entity-range(icon, label, value)
\whitespace trim
<div class="mark" title="$icon$ $value$">
  <span class="label entity clean"><span class="icon-$icon$">$label$</span></span>
  <span class="data entity clean"><$macrocall $name="dnd.range" range="$value$"/></span>
</div>
\end

\define damage(dice)
<$macrocall $name=mark-dice icon=hp-empty color=negative dice="$dice$"/>
\end

\define bludgeoning(dice)
<$macrocall $name=mark-dice icon=bludgeoning color=negative dice="$dice$"/>
\end

\define piercing(dice)
<$macrocall $name=mark-dice icon=piercing color=negative dice="$dice$"/>
\end

\define slashing(dice)
<$macrocall $name=mark-dice icon=slashing color=negative dice="$dice$"/>
\end

\define acid(dice)
<$macrocall $name=mark-dice icon=acid color=negative dice="$dice$"/>
\end

\define cold(dice)
<$macrocall $name=mark-dice icon=cold color=negative dice="$dice$"/>
\end

\define fire(dice)
<$macrocall $name=mark-dice icon=fire color=negative dice="$dice$"/>
\end

\define force(dice)
<$macrocall $name=mark-dice icon=force color=negative dice="$dice$"/>
\end

\define lightning(dice)
<$macrocall $name=mark-dice  icon=lightning color=negative dice="$dice$"/>
\end

\define necrotic(dice)
<$macrocall $name=mark-dice icon=necrotic color=negative dice="$dice$"/>
\end

\define poison(dice)
<$macrocall $name=mark-dice icon=poison color=negative dice="$dice$"/>
\end

\define psychic(dice)
<$macrocall $name=mark-dice icon=psychic color=negative dice="$dice$"/>
\end

\define radiant(dice)
<$macrocall $name=mark-dice icon=radiant color=negative dice="$dice$"/>
\end

\define thunder(dice)
<$macrocall $name=mark-dice icon=thunder color=negative dice="$dice$"/>
\end

\define heal(dice)
<$macrocall $name=mark-dice icon=hp-full color=positive dice="$dice$"/>
\end

\define circle(value)
<$macrocall $name=entity-range icon=circle value="$value$"/>
\end

\define square(value)
<$macrocall $name=entity-range icon=square value="$value$"/>
\end

\define sphere(value)
<$macrocall $name=entity-range icon=sphere value="$value$"/>
\end

\define cube(value)
<$macrocall $name=entity-range icon=cube value="$value$"/>
\end

\define cone(value)
<$macrocall $name=entity-range icon=cone value="$value$"/>
\end

\define cylinder(value)
<$macrocall $name=entity-range icon=cylinder value="$value$"/>
\end

\define line(value)
<$macrocall $name=entity-range icon=line value="$value$"/>
\end

\define wall(value)
<$macrocall $name=entity-range icon=wall value="$value$"/>
\end

\define distance(value)
<$macrocall $name=entity-range icon=distance value="$value$"/>
\end

\define range(value)
<$macrocall $name=entity-range icon=distance value="$value$"/>
\end

\define reach(value)
<$macrocall $name=entity-range icon=distance value="$value$"/>
\end

\define per(value)
<$macrocall $name=entity icon=person value="$value$"/>
\end

\define loc(value)
<$macrocall $name=entity icon=location value="$value$"/>
\end

\define org(value)
<$macrocall $name=entity icon=organization value="$value$"/>
\end

\define time(value)
<$macrocall $name=entity icon=time value="$value$"/>
\end

\define light(value)
<$macrocall $name=entity icon=light value="$value$"/>
\end

\define bright(value)
\whitespace trim
<div class="mark" title="bright $value$">
  <span class="label entity clean"><span class="icon-light"/></span>
  <span class="data entity clean">Bright&nbsp;<$macrocall $name="dnd.range" range="$value$"/></span>
</div>
\end

\define dim(value)
\whitespace trim
<div class="mark" title="dim $value$">
  <span class="label entity clean"><span class="icon-light"/></span>
  <span class="data entity clean">Dim&nbsp;<$macrocall $name="dnd.range" range="$value$"/></span>
</div>
\end

\define darkness(value)
\whitespace trim
<div class="mark" title="darkness $value$">
  <span class="label entity clean"><span class="icon-light"/></span>
  <span class="data entity clean">Darkness&nbsp;<$macrocall $name="dnd.range" range="$value$"/></span>
</div>
\end

\define mob(monster)
<$macrocall $name=entity icon=monster label="{{$monster$||Link}}"/>
\end

\define loot(value)
<$macrocall $name=entity icon=loot value="$value$"/>
\end

\define book(value)
<$macrocall $name=entity icon=book value="$value$"/>
\end

\define spellbook(value)
<$macrocall $name=entity icon=spellbook value="$value$"/>
\end

\define potion(value)
<$macrocall $name=entity icon=potion value="$value$"/>
\end

\define scroll(value)
<$macrocall $name=entity icon=scroll value="$value$"/>
\end

\define roll(value)
<$macrocall $name=entity icon=roll-dice value="$value$"/>
\end

\define ac(value)
<$macrocall $name=entity icon=ac value="$value$"/>
\end

\define hp(value)
<$macrocall $name=entity icon=hp-full value="$value$"/>
\end

\define temp-hp(value)
<$macrocall $name=entity icon=hp-temp value="$value$"/>
\end

\define terrain(value)
<$macrocall $name=entity icon=terrain value="$value$"/>
\end

\define difficult()
<$macrocall $name=entity icon=terrain value="Difficult"/>
\end

\define melee(weapon, tohit)
<$macrocall $name=mark-icon icon=melee label="&nbsp;$weapon$" value="$tohit$"/>
\end

\define ranged(weapon, tohit)
<$macrocall $name=mark-icon icon=ranged label="&nbsp;$weapon$" value="$tohit$"/>
\end

\define casted(spell, tohit)
<$macrocall $name=mark-icon icon=spell label="&nbsp;$spell$" value="$tohit$"/>
\end

\define save(label, value)
\whitespace trim
<div class="mark" title="saving-throw $label$ $value$">
  <span class="label save"><span class="icon-saving-throw"/>$label$</span>
  <span class="data value">$value$</span>
</div>
\end

\define skillcheck(label, value)
\whitespace trim
<div class="mark" title="ability-check $label$ $value$">
  <span class="label skill"><span class="icon-skill-check"/>$label$</span>
  <span class="data value">$value$</span>
</div>
\end

\define acrobatics(dc)
<<skillcheck "Dexterity (Acrobatics)" $dc$>>
\end

\define animalhandling(dc)
<<skillcheck "Wisdom (Animal Handling)" $dc$>>
\end

\define arcana(dc)
<<skillcheck "Intelligence (Arcana)" $dc$>>
\end

\define athletics(dc)
<<skillcheck "Strength (Athletics)" $dc$>>
\end

\define deception(dc)
<<skillcheck "Charisma (Deception)" $dc$>>
\end

\define history(dc)
<<skillcheck "Intelligence (History)" $dc$>>
\end

\define insight(dc)
<<skillcheck "Wisdom (Insight)" $dc$>>
\end

\define intimidation(dc)
<<skillcheck "Charisma (Intimidation)" $dc$>>
\end

\define investigation(dc)
<<skillcheck "Intelligence (Investigation)" $dc$>>
\end

\define medicine(dc)
<<skillcheck "Wisdom (Medicine)" $dc$>>
\end

\define nature(dc)
<<skillcheck "Intelligence (Nature)" $dc$>>
\end

\define perception(dc)
<<skillcheck "Wisdom (Perception)" $dc$>>
\end

\define pp(dc)
<<skillcheck "Passive Perception" $dc$>>
\end

\define performance(dc)
<<skillcheck "Charisma (Performance)" $dc$>>
\end

\define persuasion(dc)
<<skillcheck "Charisma (Persuasion)" $dc$>>
\end

\define religion(dc)
<<skillcheck "Intelligence (Religion)" $dc$>>
\end

\define sleightofhand(dc)
<<skillcheck "Dexterity (Sleight of Hand)" $dc$>>
\end

\define stealth(dc)
<<skillcheck "Dexterity (Stealth)" $dc$>>
\end

\define survival(dc)
<<skillcheck "Wisdom (Survival)" $dc$>>
\end

\define thievestools(dc)
<<skillcheck "Dexterity (Thieves' Tools)" $dc$>>
\end

\define target()
<span class="icon-target entity-tag" title="target"/>
\end

\define self()
<span class="icon-self entity-tag" title="self"/>
\end

\define ritual()
<span class="icon-ritual entity-tag" title="ritual"/>
\end

\define concentration()
<span class="icon-concentration entity-tag" title="concentration"/>
\end

\define upcast()
<span class="icon-upcast entity-tag" title="upcast"/>
\end

\define touch()
<span class="icon-touch entity-tag" title="touch"/>
\end

\define instant()
<span class="icon-instantaneous entity-tag" title="instantaneous"/>
\end

\define na()
<span class="icon-not-applicable entity-tag" title="not-applicable"/>
\end

\define halved()
<span class="icon-hp-half entity-tag"  title="damage-halved"/>
\end

\define advantage()
<span class="icon-advantage entity-tag" title="advantage"/>
\end

\define disadvantage()
<span class="icon-disadvantage entity-tag" title="disadvantage"/>
\end

\define action()
<span class="icon-action" title="action"/>
\end

\define ba()
<span class="icon-bonus-action" title="bonus-action"/>
\end

\define reaction()
<span class="icon-reaction" title="reaction"/>
\end

\define round(value)
<$macrocall $name=entity icon=round value="$value$"/>
\end

\define turn(value)
<$macrocall $name=entity icon=round value="$value$"/>
\end

\define tick()
<span class="icon-tick" title="pass"/>
\end

\define cross()
<span class="icon-cross" title="fail"/>
\end

\define dnd()
<span class="icon-dnd" title="d&d"/>
\end

\define al()
<span class="icon-al" title="adventurers' league"/>
\end

\define pass(value)
\whitespace trim
<div class="mark" title="pass">
  <span class="label pass">''&#10003;&nbsp;''</span>
  <span class="data value">$value$</span>
</div>
\end

\define fail(value)
\whitespace trim
<div class="mark" title="fail">
  <span class="label fail">''&#10005;&nbsp;''</span>
  <span class="data value">$value$</span>
</div>
\end

---

{{TestMark}}
|max top|k
|^!Entity Mark |''Entity Text''<br/>[[$:/config/DefaultColourMappings/mark-entity-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-entity-text" tag=input/>|
|~|''Entity Background''<br/>[[$:/config/DefaultColourMappings/mark-entity-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-entity-background" tag=input/>|
|^!Positive Mark |''Positive Text''<br/>[[$:/config/DefaultColourMappings/mark-positive-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-positive-text" tag=input/>|
|~|''Positive Background''<br/>[[$:/config/DefaultColourMappings/mark-positive-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-positive-background" tag=input/>|
|^!Negative Mark |''Negative Text''<br/>[[$:/config/DefaultColourMappings/mark-negative-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-negative-text" tag=input/>|
|~|''Negative Background''<br/>[[$:/config/DefaultColourMappings/mark-negative-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-negative-background" tag=input/>|
|^!Saving Throw Mark |''Saving Throw Text''<br/>[[$:/config/DefaultColourMappings/mark-save-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-save-text" tag=input/>|
|~|''Saving Throw Background''<br/>[[$:/config/DefaultColourMappings/mark-save-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-save-background" tag=input/>|
|^!Skill Check Mark |''Skill Check Text''<br/>[[$:/config/DefaultColourMappings/mark-skill-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-skill-text" tag=input/>|
|~|''Skill Check Background''<br/>[[$:/config/DefaultColourMappings/mark-skill-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-skill-background" tag=input/>|
|^!Pass Mark |''Pass Text''<br/>[[$:/config/DefaultColourMappings/mark-pass-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-pass-text" tag=input/>|
|~|''Pass Background''<br/>[[$:/config/DefaultColourMappings/mark-pass-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-pass-background" tag=input/>|
|^!Fail Mark |''Fail Text''<br/>[[$:/config/DefaultColourMappings/mark-fail-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-fail-text" tag=input/>|
|~|''Fail Background''<br/>[[$:/config/DefaultColourMappings/mark-fail-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-fail-background" tag=input/>|
|^!Value Mark |''Value Text''<br/>[[$:/config/DefaultColourMappings/mark-value-text]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-value-text" tag=input/>|
|~|''Value Background''<br/>[[$:/config/DefaultColourMappings/mark-value-background]] |<$edit-text tiddler="$:/config/DefaultColourMappings/mark-value-background" tag=input/>|
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
.mark {
  display: inline-block;
}

.mark .label {
  border-top-left-radius: 4px;
  border-bottom-left-radius: 4px;
  padding: 0px 2px 0px 4px;
  font-weight: bold;
}

.mark .data {
  border-top-right-radius: 4px;
  border-bottom-right-radius: 4px;
  padding: 0px 4px 0px 3px;
  font-weight: bold;
}

.mark .red {
  background: #b16b6b;
  color: white;
}

.mark .brown {
  background: #b18e6b;
  color: white;
}

.mark .blue {
  background: #6b9cb1;
  color: white;
}

.mark .green {
  background: #6bb18c;
  color: white;
}

.mark .yellow {
  background: #d7d782;
  color: white;
}

.mark .grey {
  background: #999999;
  color: white;
}

.mark  .black {
  background: #000000;
  color: white;
}

.mark .tag {
  background: <<color "tag-background">>;
  color: <<color "tag-foreground">>;
}

.mark .positive {
  background: <<color "mark-positive-background">>;
  color: <<color "mark-positive-text">>;
}

.mark .negative {
  background: <<color "mark-negative-background">>;
  color: <<color "mark-negative-text">>;
}

.mark .value {
  background: <<color "mark-value-background">>;
  color: <<color "mark-value-text">>;
}

.mark .save {
  background: <<color "mark-save-background">>;
  color: <<color "mark-save-text">>;
}

.mark .skill {
  background: <<color "mark-skill-background">>;
  color: <<color "mark-skill-text">>;
}

.mark .pass {
  background: <<color "mark-pass-background">>;
  color: <<color "mark-pass-text">>;
}

.mark .fail {
  background: <<color "mark-fail-background">>;
  color: <<color "mark-fail-text">>;
}

.mark .entity {
  background: <<color "mark-entity-background">>;
  color: <<color "mark-entity-text">>;
}

.mark .clean {
  border-top-left-radius: 0px;
  border-bottom-left-radius: 0px;
  padding: 0px 1px 0px 1px;
}

span.entity-tag {
  background: <<color "mark-entity-background">>;
  color: <<color "mark-entity-text">>;
}

pass {
  display: inline-block;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  border-top-right-radius: 4px; 
  border-bottom-right-radius: 4px; 
  padding: 0px 6px 0px 0px;
  margin: 0px 0px;
  background-color: <<color mark-value-background>>;
  color: <<color mark-value-text>>;
}

pass:before {
  content: "\e94e";
  border-top-left-radius: 4px; 
  border-bottom-left-radius: 4px; 
  padding: 0px 4px 0px 6px; 
  font-weight: bold;
  background-color: <<color mark-pass-background>>;
  color: <<color mark-pass-text>>;
}

fail {
  display: inline-block;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  border-top-right-radius: 4px; 
  border-bottom-right-radius: 4px; 
  padding: 0px 6px 0px 0px;
  background-color: <<color mark-value-background>>;
  color: <<color mark-value-text>>;
}

fail:before {
  content: "\e94d";
  border-top-left-radius: 4px; 
  border-bottom-left-radius: 4px; 
  padding: 0px 4px 0px 6px; 
  font-weight: bold;
  background-color: <<color mark-pass-background>>;
  background-color: <<color mark-fail-background>>;
  color: <<color mark-fail-text>>;
}

action {
  display: inline-block;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  border-top-right-radius: 4px; 
  border-bottom-right-radius: 4px; 
  padding: 0px 6px 0px 0px;
  margin: 0px 0px;
  background-color: <<color mark-value-background>>;
  color: <<color mark-value-text>>;
}

action:before {
  content: "\e935";
  border-top-left-radius: 4px; 
  border-bottom-left-radius: 4px; 
  padding: 0px 4px 0px 6px; 
  font-weight: bold;
  background-color: <<color mark-entity-background>>;
  color: <<color mark-entity-text>>;
}

ba {
  display: inline-block;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  border-top-right-radius: 4px; 
  border-bottom-right-radius: 4px; 
  padding: 0px 6px 0px 0px;
  margin: 0px 0px;
  background-color: <<color mark-value-background>>;
  color: <<color mark-value-text>>;
}

ba:before {
  content: "\e950";
  border-top-left-radius: 4px; 
  border-bottom-left-radius: 4px; 
  padding: 0px 4px 0px 6px; 
  font-weight: bold;
  background-color: <<color mark-entity-background>>;
  color: <<color mark-entity-text>>;
}

reaction {
  display: inline-block;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", dndicon !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  font-size: 15px;
  text-transform: none;
  border-top-right-radius: 4px; 
  border-bottom-right-radius: 4px; 
  padding: 0px 6px 0px 0px;
  margin: 0px 0px;
  background-color: <<color mark-value-background>>;
  color: <<color mark-value-text>>;
}

reaction:before {
  content: "\e936";
  border-top-left-radius: 4px; 
  border-bottom-left-radius: 4px; 
  padding: 0px 4px 0px 6px; 
  font-weight: bold;
  background-color: <<color mark-entity-background>>;
  color: <<color mark-entity-text>>;
}

At 3rd level, you choose an archetype that you strive to emulate in your combat styles and techniques. Choose <$list filter="[tag[Fighter]tag[Subclass]sort[]butlast[]]">{{||Link}}, </$list><$list filter="[tag[Fighter]tag[Subclass]sort[]last[]]"> or {{||Link}}</$list> all detailed at the end of the class description. The archetype you choose grants you features at 3rd level and again at 7th, 10th, 15th, and 18th level.
At 1st level, your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-handed or heavy property.

You gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:

* You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.
* You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.
* When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.

Certain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon in the Weapons section.
Typically found in <<roll 1d4>> pots inside a fine wooden box with a brush (weighing 1 pound in total), these pigments allow you to create three-dimensional objects by painting them in two dimensions. The paint flows from the brush to form the desired object as you concentrate on its image.

Each pot of paint is sufficient to cover 1,000 square feet of a surface, which lets you create inanimate objects or terrain features—such as a door, a pit, flowers, trees, cells, rooms, or weapons—that are up to 10,000 cubic feet. It takes 10 minutes to cover 100 square feet.

When you complete the painting, the object or terrain feature depicted becomes a real, nonmagical object. Thus, painting a door on a wall creates an actual door that can be opened to whatever is beyond. Painting a pit on a floor creates a real pit, and its depth counts against the total area of objects you create.

Nothing created by the pigments can have a value greater than 25 gp. If you paint an object of greater value (such as a diamond or a pile of gold), the object looks authentic, but close inspection reveals it is made from paste, bone, or some other worthless material.

If you paint a form of energy such as fire or lightning, the energy appears but dissipates as soon as you complete the painting, doing no harm to anything.
You can cast disguise self at will, without expending a spell slot.
Mason’s tools allow you to craft stone structures, including walls and buildings crafted from brick.

''Components.'' Mason’s tools consist of:

* a trowel
* a hammer
* a chisel
* brushes
* a square

''History.'' Your expertise aids you in identifying a stone building’s date of construction and purpose, along with insight into who might have built it.

''Investigation.'' You gain additional insight when inspecting areas within stone structures.

''Perception.'' You can spot irregularities in stone walls or floors, making it easier to find trap doors and secret passages.

''Demolition.'' Your knowledge of masonry allows you to spot weak points in brick walls. You deal double damage to such structures with your weapon attacks.

| !Activity | !DC |
|!Chisel a small hole in a stone wall | 10 |
|!Find a weak point in a stone wall | 15 |
A wave of healing energy washes out from a point of your choice within range.
Choose up to six creatures in a 30-foot-radius sphere centered on that point. Each target regains hit points equal to 3d8 + your spellcasting ability modifier. This spell has no effect on undead or constructs.
A flood of healing energy flows from you into injured creatures around you. You restore up to 700 hit points, divided as you choose among any number of creatures that you can see within range. Creatures healed by this spell are also cured of all diseases and any effect making them [[Blinded]] or [[Deafened]]. This spell has no effect on undead or constructs.
As you call out words of restoration, up to six creatures of your choice that you can see within range regain hit points equal to 1d4 + your spellcasting ability modifier. This spell has no effect on undead or constructs.
You suggest a course of activity (limited to a sentence or two) and magically influence up to twelve creatures of your choice that you can see within range and that can hear and understand you.
Creatures that can’t be [[Charmed]] are immune to this effect. The suggestion must be worded in such a manner as to make the course of action sound reasonable. Asking the creature to stab itself, throw itself onto a spear, immolate itself, or do some other obviously harmful act automatically negates the effect of the spell.

Each target must make a Wisdom saving throw. On a failed save, it pursues the course of action you described to the best of its ability. The suggested course of action can continue for the entire duration. If the suggested activity can be completed in a shorter time, the spell ends when the subject finishes what it was asked to do.

You can also specify conditions that will trigger a special activity during the duration. For example, you might suggest that a group of soldiers give all their money to the first beggar they meet. If the condition isn’t met before the spell ends, the activity isn’t performed.

If you or any of your companions damage a creature affected by this spell, the spell ends for that creature.
''Prerequisite:'' 15th level

You can cast alter self at will, without expending a spell slot.

"""
''Keen Hearing and Smell.'' The mastiff has advantage on Wisdom (Perception) checks that rely on hearing or smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d6+1>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Str 11>> or be knocked [[Prone]]. |<|
You banish a creature that you can see within range into a labyrinthine demiplane. The target remains there for the duration or until it escapes the maze.

The target can use its action to attempt to escape. When it does so, it makes a DC 20 Intelligence check. If it succeeds, it escapes, and the spell ends (a minotaur or goristro demon automatically succeeds).

When the spell ends, the target reappears in the space it left or, if that space is occupied, in the nearest unoccupied space.
The medallion has 3 charges. While wearing it, you can use an action and expend 1 charge to cast the [[Detect Thoughts]] spell (<<save "Spell DC" 13>>) from it. The medallion regains <<roll 1d3>> expended charges daily at dawn.
<div style="display: flex;">
<<stat Medium 5 Objects>>
<<stat Armor 13 Class>>
<<stat Hit 40 Points>>
</div>
<div style="display: flex;">
<<ability-value Strength 10>>
<<ability-value Dexterity 12>>
<<ability-value Constitution 10>>
<<ability-value Intelligence 3>>
<<ability-value Wisdom 3>>
<<ability-value Charisma 1>>
</div>

| !<<action>> Actions |<|<|
| !<<melee Slam +5>>|<<bludgeoning 2d6+1>> |<<reach 5>> |
"""
''Petrifying Gaze.'' When a creature that can see the medusa’s eyes starts its turn within <<sphere 30>> of the medusa, the medusa can force it to make a <<save Con 14>> if the medusa isn’t [[Incapacitated]] and can see the creature. If the saving throw fails by 5 or more, the creature is instantly [[Petrified]]. Otherwise, a creature that fails the save begins to turn to stone and is [[Restrained]]. The [[Restrained]] creature must repeat the saving throw at the end of its next turn, becoming petrified on a failure or ending the effect on a success. The petrification lasts until the creature is freed by the [[Greater Restoration]] spell or other magic.

Unless surprised, a creature can avert its eyes to avoid the saving throw at the start of its turn. If the creature does so, it can’t see the medusa until the start of its next turn, when it can avert its eyes again. If the creature looks at the medusa in the meantime, it must immediately make the save.
If the medusa sees itself reflected on a polished surface within 30 feet of it and in an area of <<bright>>, the medusa is, due to its curse, affected by its own gaze.
"""
<<divider>>
''Multiattack.'' The medusa makes either three melee attacks — one with its snake hair and two with its shortsword — or two ranged attacks with its longbow.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Snake Hair" +5>>|<<piercing 1d4+2>> + <<poison 4d6>> |<<reach 5>> |
| !<<melee Shortsword +5>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged Longbow +5>>|<<piercing 1d8+2>> + <<poison 2d6>> |<<range 150/600>> |
You step into a stone object or surface large enough to fully contain your body, melding yourself and all the equipment you carry with the stone for the duration.
Using your movement, you step into the stone at a point you can touch. Nothing of your presence remains visible or otherwise detectable by nonmagical senses.

While merged with the stone, you can’t see what occurs outside it, and any Wisdom (Perception) checks you make to hear sounds outside it are made with disadvantage. You remain aware of the passage of time and can cast spells on yourself while merged in the stone. You can use your movement to leave the stone where you entered it, which ends the spell. You otherwise can’t move.

Minor physical damage to the stone doesn’t harm you, but its partial destruction or a change in its shape (to the extent that you no longer fit within it) expels you and deals 6d6 bludgeoning damage to you. The stone’s complete destruction (or transmutation into a different substance) expels you and deals 50 bludgeoning damage to you. If expelled, you fall prone in an unoccupied space closest to where you first entered.
You gain proficiency in the Intimidation skill.
This spell repairs a single break or tear in an object you touch, such as broken chain link, two halves of a broken key, a torn cloack, or a leaking wineskin.
As long as the break or tear is no larger than 1 foot in any dimension, you mend it, leaving no trace of the former damage.

This spell can physically repair a magic item or construct, but the spell can’t restore magic to such an object.
"""
''Amphibious.'' The merfolk can breathe air and water. 
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Spear +2>>|<<piercing 1d6>><br/><<piercing 1d8>> (''Two-handed'') |<<reach 5>><br/><<range 20/60>> |
"""
''Amphibious.'' The merrow can breathe air and water.
"""
<<divider>>
''Multiattack.'' The merrow makes two attacks: one with its bite and one with its claws or harpoon.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1d8+4>> |<<reach 5>> |
| !<<melee Claw +6>>|<<slashing 2d4+4>> |<<reach 5>> |
| !<<ranged Harpoon +6>>|<<piercing 2d6+4>> |<<reach 5>><br/><<range 20/60>> |
|~|If the target is a Huge or smaller creature, it must succeed on a Strength contest check against the Merrow or be pulled up to 20 feet toward the Merrow |<|
You point your finger toward a creature within range and whisper a message.
The target (and only the target) hears the message and can reply in a whisper that only you can hear.

You can cast this spell through solid objects if you are familiar with the target and know it is beyond the barrier. Magical silence, 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or 3 feet of wood blocks the spell. The spell doesn’t have to follow a straight line and can travel freely around corners or through openings.
At 3rd level, you gain the ability to twist your spells to suit your needs. You gain two of the following Metamagic options of your choice. You gain another one at 10th and 17th level.

You can use only one Metamagic option on a spell when you cast it, unless otherwise noted.

<<p "Careful Spell">>
<<p "Distant Spell">>
<<p "Empowered Spell">>
<<p "Extended Spell">>
<<p "Heightened Spell">>
<<p "Quickened Spell">>
<<p "Seeking Spell">>
<<p "Subtle Spell">>
<<p "Transmuted Spell">>
<<p "Twinned Spell">>

Blazing orbs of fire plummet to the ground at four different points you can see within range.
Each creature in a 40-foot-radius sphere centered on each point you choose must make a Dexterity saving throw. The sphere spreads around corners. A creature takes 20d6 fire damage and 20d6 bludgeoning damage on a failed save, or half as much damage on a sucessful one. A creature in the area of more than one fiery burst is affected only once.

The spell damages objects in the area and ignites flammable objects that aren’t being worn or carried.
"""
''Price per Dose:'' 1,500 gp
"""

* A creature that ingests this poison suffers no effect until the stroke of midnight. 
* If the poison has not been neutralized before then, the creature must succeed on a <<save Con 17>>
** <fail><<poison 9d6>></fail>
** <pass><<halved>></pass>
"""
''Shapechanger.'' The mimic can use its action to polymorph into an object or back into its true, amorphous form. Its statistics are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Adhesive (Object Form Only).'' The mimic adheres to anything that touches it. A Huge or smaller creature adhered to the mimic is also [[Grappled]] by it (<<skillcheck Escape 13>>). Ability checks made to escape this grapple have disadvantage.
''False Appearance (Object Form Only).'' While the mimic remains motionless, it is indistinguishable from an ordinary object.
''Grappler.'' The mimic has advantage on attack rolls against any creature grappled by it.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pseudopod +5>>|<<bludgeoning 1d8+3>> |<<reach 5>> |
|~|If the mimic is in object form, the target is subjected to its Adhesive trait. |<|
| !<<melee Bite +5>>|<<piercing 1d8+3>> + <<acid 1d8>> |<<reach 5>> |
Until the spell ends, one willing creature you touch is immune to psychic damage, any effect that would sense its emotions or read its thoughts, divination spells, and the [[Charmed]] condition. The spell even foils wish spells and spells or effects of similar power used to affect the target&#8217;s mind or to gain information about the target.
Beginning at 6th level, you can’t be charmed or frightened while raging. If you are charmed or frightened when you enter your rage, the effect is suspended for the duration of the rage.

''Prerequisite:'' 9th level

You can cast conjure elemental once using a warlock spell slot. You can’t do so again until you finish a long rest.

You create a sound or an image of an object within range that lasts for the duration. The illusion also ends if you dismiss it as an action or cast this spell again.

If you create a sound, its volume can range from a whisper to a scream. It can be your voice, someone else’s voice, a lion’s roar, a beating of drums, or any other sound you choose. The sound continues unabated throughout the duration, or you can make discrete sounds at different times before the spell ends.

If you create an image of an object, //such as a chair, muddy footprints, or a small chest//, it must be no larger than a 5-foot cube. The image can’t create sound, light, smell, or any other sensory effect. Physical interaction with the image reveals it to be an illusion, because things can pass through it.

If a creature uses its action to examine the sound or image, the creature can determine that it is an illusion with a successful Intelligence (Investigation) check against your spell save DC. If a creature discerns the illusion for what it is, the illusion becomes faint to the creature.
"""
''Charge.'' If the minotaur moves at least 10 feet straight toward a target and then hits it with a gore attack on the same turn, the target takes an extra <<piercing 2d8>>. If the target is a creature, it must succeed on a <<save Str 14>> or be pushed up to 10 feet away and knocked [[Prone]].
''Labyrinthine Recall.'' The minotaur can perfectly recall any path it has traveled.
''Reckless.'' At the start of its turn, the minotaur can gain advantage on all melee weapon attack rolls it makes during that turn, but attack rolls against it have advantage until the start of its next turn.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greataxe +6>>|<<slashing 2d12+4>> |<<reach 5>> |
| !<<melee Gore +6>>|<<piercing 2d8+4>> |<<reach 5>> |
"""
''Charge.'' If the skeleton moves at least 10 feet straight toward a target and then hits it with a gore attack on the same turn, the target takes an extra <<piercing 2d8>>. If the target is a creature, it must succeed on a <<save Str 14>> or be pushed up to 10 feet away and knocked [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greataxe +6>>|<<slashing 2d12+4>> |<<reach 5>> |
| !<<melee Gore +6>>|<<piercing 2d8+4>> |<<reach 5>> |
You make terrain in an area up to 1 mile square look, sound, smell, and even feel like some other sort of terrain. The terrain's general shape remains the same, however. Open fields or a road could be made to resemble a swamp, hill, crevasse, or some other difficult or impassable terrain. A pond can be made to seem like a grassy meadow, a precipice like a gentle slope, or a rock-strewn gully like a wide and smooth road.

Similarly, you can alter the appearance of structures, or add them where none are present. The spell doesn't disguise, conceal, or add creatures.

The illusion includes audible, visual, tactile, and olfactory elements, so it can turn clear ground into difficult terrain (or vice versa) or otherwise impede movement through the area. Any piece of the illusory terrain (such as a rock or stick) that is removed from the spell's area disappears immediately.

Creatures with [[Truesight]] can see through the illusion to the terrain's true form; however, all other elements of the illusion remain, so while the creature is aware of the illusion's presence, the creature can still physically interact with the illusion.
''Prerequisite:'' 5th level

You can cast slow once using a warlock spell slot. You can’t do so again until you finish a long rest.

Three illusory duplicates of yourself appear in your space. Until the spell ends, the duplicates move with you and mimic your actions, shifting position so it's impossible to track which image is real. You can use your action to dismiss the illusory duplicates.

Each time a creature targets you with an attack during the spell's duration, roll a d20 to determine whether the attack instead targets one of your duplicates.

If you have three duplicates, you must roll a 6 or higher to change the attack's target to a duplicate. With two duplicates, you must roll an 8 or higher. With one duplicate, you must roll an 11 or higher.

A duplicate's AC equals 10 + your Dexterity modifier. If an attack hits a duplicate, the duplicate is destroyed. A duplicate can be destroyed only by an attack that hits it. It ignores all other damage and effects. The spell ends when all three duplicates are destroyed.

A creature is unaffected by this spell if it can't see, if it relies on senses other than sight, such as blindsight, or if it can perceive illusions as false, as with truesight.
When this 4-foot-tall mirror is viewed indirectly, its surface shows faint images of creatures. The mirror weighs 50 pounds, and it has <<ac11>>, <<hp 10>>, and vulnerability to <<bludgeoning bludgeoning>> damage. It shatters and is destroyed when reduced to <<hp 0>>.

If the mirror is hanging on a vertical surface and you are within 5 feet of it, you can use an action to speak its command word and activate it. It remains activated until you use an action to speak the command word again.

Any creature other than you that sees its reflection in the activated mirror while within 30 feet of it must succeed on a <<save Cha 15>> throw or be trapped, along with anything it is wearing or carrying, in one of the mirror’s twelve extradimensional cells. This saving throw is made with advantage if the creature knows the mirror’s nature, and constructs succeed on the saving throw automatically.

An extradimensional cell is an infinite expanse filled with thick fog that reduces visibility to 10 feet. Creatures trapped in the mirror’s cells don’t age, and they don’t need to eat, drink, or sleep. A creature trapped within a cell can escape using magic that permits planar travel. Otherwise, the creature is confined to the cell until freed.

If the mirror traps a creature but its twelve extradimensional cells are already occupied, the mirror frees one trapped creature at random to accommodate the new prisoner. A freed creature appears in an unoccupied space within sight of the mirror but facing away from it. If the mirror is shattered, all creatures it contains are freed and appear in unoccupied spaces near it.

While within 5 feet of the mirror, you can use an action to speak the name of one creature trapped in it or call out a particular cell by number. The creature named or contained in the named cell appears as an image on the mirror’s surface. You and the creature can then communicate normally.

In a similar way, you can use an action to speak a second command word and free one creature trapped in the mirror. The freed creature appears, along with its possessions, in the unoccupied space nearest to the mirror and facing away from it.
You become invisible at the same time that an illusory double of you appears where you are standing. The double lasts for the duration, but the invisibility ends if you attack or cast a spell.

You can use your action to move your illusory double up to twice your speed and make it gesture, speak, and behave in whatever way you choose.

You can see through its eyes and hear through its ears as if you were located where it is. On each of your turns as a bonus action, you can switch from using its senses to using your own, or back again. While you are using its senses, you are blinded and deafened in regard to your own surroundings.
Briefly surrounded by silvery mist, you teleport up to 30 feet to an unoccupied space that you can see.
You can cast silent image at will, without expending a spell slot or material components.
Mithral is a light, flexible metal. A mithral chain shirt or breastplate can be worn under normal clothes. If the armor normally imposes disadvantage on Dexterity (Stealth) checks or has a Strength requirement, the mithral version of the armor doesn’t.
1: -5
2: -4
3: -4
4: -3
5: -3
6: -2
7: -2
8: -1
9: -1
10: 0
11: 0
12: +1
13: +1
14: +2
15: +2
16: +3
17: +3
18: +4
19: +4
20: +5
21: +5
22: +6
23: +6
24: +7
25: +7
26: +8
27: +8
28: +9
29: +9
30: +10

You attempt to reshape another creature’s memories.

One creature that you can see must make a Wisdom saving throw. If you are fighting the creature, it has advantage on the saving throw. On a failed save, the target becomes [[Charmed]] by you for the duration. The charmed target is [[Incapacitated]] and unaware of its surroundings, though it can still hear you. If it takes any damage or is targeted by another spell, this spell ends, and none of the target’s memories are modified.

While this charm lasts, you can affect the target’s memory of an event that it experienced within the last 24 hours and that lasted no more than 10 minutes. You can permanently eliminate all memory of the event, allow the target to recall the event with perfect clarity and exacting detail, change its memory of the details of the event, or create a memory of some other event.

You must speak to the target to describe how its memories are affected, and it must be able to understand your language for the modified memories to take root. Its mind fills in any gaps in the details of your description. If the spell ends before you have finished describing the modified memories, the creature’s memory isn’t altered. Otherwise, the modified memories take hold when the spell ends.

A modified memory doesn’t necessarily affect how a creature behaves, particularly if the memory contradicts the creature’s natural inclinations, alignment, or beliefs. An illogical modified memory, such as implanting a memory of how much the creature enjoyed dousing itself in acid, is dismissed, perhaps as a bad dream. The DM might deem a modified memory too nonsensical to affect a creature in a significant manner.

A remove curse or greater restoration spell cast on the target restores the creature’s true memory.
When you reach 3rd level, you commit yourself to a monastic tradition: the Way of the Open Hand, detailed at the end of the class description or one from another source. Your tradition grants you features at 3rd level and again at 6th, 11th, and 17th level.
As a monk, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d8 per monk level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per monk level after 1st
"""

!!! Proficiencies

"""
''Armor:'' None
''Weapons:'' Simple weapons, shortswords
''Tools:'' Choose one type of artisan’s tools or one musical instrument
''Saving Throws:'' Strength, Dexterity
''Skills:'' Choose two from Acrobatics, Athletics, History, Insight, Religion, and Stealth
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a shortsword or (b) any simple weapon
(a) a dungeoneer’s pack or (b) an explorer’s pack
10 darts
"""

!!! Subclasses

<<list-box "[tag[Monk]tag[Subclass]sort[]]">>

!!! Advancement Table
{{||MonkAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Unarmored Defense]] [[Martial Arts]] [[Ki]] [[Unarmored Movement]] [[Dedicated Weapon]] [[Monastic Tradition]] [[Deflect Missiles]] [[Ki-Fueled Attack]] [[Monk Ability Score Improvement]] [[Quickened Healing]] [[Slow Fall]] [[Monk Extra Attack]] [[Stunning Strike]] [[Focused Aim]] [[Ki-Empowered Strikes]] [[Monk Evasion]] [[Stillness of Mind]] [[Unarmored Movement Improvement]] [[Purity of Body]] [[Tongue of the Sun and Moon]] [[Diamond Soul]] [[Timeless Body]] [[Empty Body]] [[Perfect Self]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Monk Ability Score Improvement}}
{{Monk Ability Score Improvement}}
{{Monk Ability Score Improvement}}
{{Monk Ability Score Improvement}}
| !Level | !Proficiency Bonus | !Martial Arts | !Ki Points | !Unarmored Movement | !Features |
| !1st | +2 | 1d4 | — | — |[[Unarmored Defense]], [[Martial Arts]] |
| !2nd | +2 | 1d4 | 2 | +10 ft. |[[Ki]], [[Unarmored Movement]], [[Dedicated Weapon]] |
| !3rd | +2 | 1d4 | 3 | +10 ft. |Monastic Tradition, [[Deflect Missiles]], [[Ki-Fueled Attack]] |
| !4th | +2 | 1d4 | 4 | +10 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]], [[Slow Fall]], [[Quickened Healing]] |
| !5th | +3 | 1d6 | 5 | +10 ft. |[[Extra Attack|Monk Extra Attack]], [[Stunning Strike]], [[Focused Aim]] |
| !6th | +3 | 1d6 | 6 | +15 ft. |[[Ki-Empowered Strikes]], Monastic Tradition Feature |
| !7th | +3 | 1d6 | 7 | +15 ft. |[[Evasion|Monk Evasion]], [[Stillness of Mind]] |
| !8th | +3 | 1d6 | 8 | +15 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !9th | +4 | 1d6 | 9 | +15 ft. |[[Unarmored Movement Improvement]] |
| !10th | +4 | 1d6 | 10 | +20 ft. |[[Purity of Body]] |
| !11th | +4 | 1d8 | 11 | +20 ft. |Monastic Tradition Feature |
| !12th | +4 | 1d8 | 12 | +20 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !13th | +5 | 1d8 | 13 | +20 ft. |[[Tongue of the Sun and Moon]] |
| !14th | +5 | 1d8 | 14 | +25 ft. |[[Diamond Soul]] |
| !15th | +5 | 1d8 | 15 | +25 ft. |[[Timeless Body|Monk Timeless Body]] |
| !16th | +5 | 1d8 | 16 | +25 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !17th | +6 | 1d10 | 17 | +25 ft. |Monastic Tradition Feature |
| !18th | +6 | 1d10 | 18 | +30 ft. |[[Empty Body]] |
| !19th | +6 | 1d10 | 19 | +30 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !20th | +6 | 1d10 | 20 | +30 ft. |[[Perfect Self]] |
At 7th level, your instinctive agility lets you dodge out of the way of certain area effects, such as a blue dragon’s lightning breath or a fireball spell. When you are subjected to an effect that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on the saving throw, and only half damage if you fail.

Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.

<<sections-vertical "[[Flurry of Blows]] [[Patient Defense]] [[Step of the Wind]] [[Deflect Missiles]] [[Stunning Strike]] [[Diamond Soul]] [[Empty Body]] [[Perfect Self]]">>
At 15th level, your ki sustains you so that you suffer none of the frailty of old age, and you can’t be aged magically. You can still die of old age, however. In addition, you no longer need food or water.
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJ/QCi1OoDgM1qp9ZudAsGe8fMsFlLTh/PbK76/Wu34fSenF3P5+5nvb/GZ4aA9leIEhg2KGjIKIW4pdjXOMmAZ/AIeXBHyRkgp4mZFTnXacgHGurmGViqh4gaOnraqoYJa3vLStuVmvvqO7sLlYoFHEysKlyGbLx5Saz8hOzG/Nwb3TTd/Gkdi70M3Y27ev2dNE0dTu5tjoS+Tbo+3m70Lv4Ib0lfr33/K49vH79qAP8RFDjEXkFdC4MhFKKQ4MGHcSKqkyiKog7+dOnKYRSjEZBFjxclhYzBMZ/Jj4tOvkjpjyFLky5XwGzoDCc3nYRqprg5M+A/nyY4dmRX0iFREjd56kuacynTWBlVtoS6U+oIpQ36Ob06VCuIRBe8Bo0ndqNZrFnTokwANNw8tzYzWX1KMizdqTS/xmPbdq+HgDEJA0YrOMPEkePmJp5gFO5apIQfXzHas7DMvAwtK8DcUvMxdn6repYFOjNjg45Ppw69enPl06UPxh492/Vrsnd5c+6sezfv2naJFxMdOrjw4rbnkVa+3HTzys89Ry9OvFLj6pavmy7t4Ddw694lI+5KufXj8qgzf8bc+zv55ea90yxH+3r76BD+XsnvTl98qS3g33G0GeeQffz9t95u+ykYGYOJOSgghLNIKNhrD1rYmYHWHIjcdhw2FQmICEoyIoXdmAhaiClCg2GG8L2ooIknikFjjSymlKOOIPYIpF7zBUlkX9AViWSMeyXJpHtHNkmkjVA2KeWUSVZpZZFYZhnkllz26OWXNNp4o5iRhWkmh2SmmeOabKZIZplv4vfjiy4CGeeYd7bppp0VQpgnn3uOGKigcgaIJpx/8tcnnosOGtiBSNYXlYaFRrmhaiomamhhlLYYJ6T2UUogoqFSGQF7oYqqKnr6rbqoqZ8KB+usjtq6aa2HDohrrrpe2SuvugarJrHwDfv+XpeZCovssj6yyl2zuyo0baTSVqsOtvpca+yr0ObGbazUPhtut7R+C2656J7lq7rmgqrtcO5qZ6G41s77blyy4uvqqOsaye9l7O0bcH8Dt1uwwIwinHB4BzPbcKoPwxuxxOUxXHGy+mGcsbNTdmzxnCAbPGcyI2ss8sn0lqzyyim3nC+TMKP85swxA2vzv53OXLKSHffsoc1Amwzz0Dnbu3PRQB+ts55HD020ylAzPfXTRucMddQjZ2311UJX/bXXPIM9tthKm90y11iTfTbaJ2et9c9ql+321nO3vXTYdYMM99psS3132oED/vfbgxt+ON990713xnDHXfHjeje4HvnieOd9ec+TYy544nJ77rjlnReuOOiVi4646Q0/DvnqkmeuOewsy/4y4aonzDrjlLuOut29l357wbmP/vvpr6defMSsB/358b47D3zyvEPffPD8Lk97zbrPvn3t2X9JNed+a89004CW7zGm6NOM6vr9Tup+yLfGDxmY9Jel6P0anK//YAT3zwGOAXADZxrgCSZiwEMIKYE/wQ4DHwjBCEpwghSsoAUviMEManCDHOygBz8Iwg4UAAA7
|max top|k
| !Level | !Proficiency Bonus | !Martial Arts | !Ki Points | !Unarmored Movement | !Features |
| !1st | +2 | 1d4 | — | — |<<list-abilities 1>> |
| !2nd | +2 | 1d4 | 2 | +10 ft. |<<list-abilities 2>> |
| !3rd | +2 | 1d4 | 3 | +10 ft. |<<list-abilities 3>> |
| !4th | +2 | 1d4 | 4 | +10 ft. |<<list-abilities 4>> |
| !5th | +3 | 1d6 | 5 | +10 ft. |<<list-abilities 5>> |
| !6th | +3 | 1d6 | 6 | +15 ft. |<<list-abilities 6>> |
| !7th | +3 | 1d6 | 7 | +15 ft. |<<list-abilities 7>> |
| !8th | +3 | 1d6 | 8 | +15 ft. |<<list-abilities 8>> |
| !9th | +4 | 1d6 | 9 | +15 ft. |<<list-abilities 9>> |
| !10th | +4 | 1d6 | 10 | +20 ft. |<<list-abilities 10>> |
| !11th | +4 | 1d8 | 11 | +20 ft. |<<list-abilities 11>> |
| !12th | +4 | 1d8 | 12 | +20 ft. |<<list-abilities 12>> |
| !13th | +5 | 1d8 | 13 | +20 ft. |<<list-abilities 13>> |
| !14th | +5 | 1d8 | 14 | +25 ft. |<<list-abilities 14>> |
| !15th | +5 | 1d8 | 15 | +25 ft. |<<list-abilities 15>> |
| !16th | +5 | 1d8 | 16 | +25 ft. |<<list-abilities 16>> |
| !17th | +6 | 1d10 | 17 | +25 ft. |<<list-abilities 17>> |
| !18th | +6 | 1d10 | 18 | +30 ft. |<<list-abilities 18>> |
| !19th | +6 | 1d10 | 19 | +30 ft. |<<list-abilities 19>> |
| !20th | +6 | 1d10 | 20 | +30 ft. |<<list-abilities 20>> |
<<htabs "[tag[Monster Type]sort[]]">>
\define monster-stat(tiddler)
{{$tiddler$||MonsterViewTemplate}}
\end

\define monster(tiddler)
<div style="width: 500px;">
<$macrocall $name="monster-stat" tiddler="$tiddler$" />
<$transclude tiddler="$tiddler$" field=text mode=block />
</div>
\end

\define mobs(tiddlers)
<<tabs "$tiddlers$" template:MonsterTabTemplate>>
<hr/>
//Quick Links:// <<links "$tiddlers$">>
\end

\define divider()
[img[divider.png]]
\end

"""
&lt;&lt;''monster'' //tiddler//&gt;&gt; - Display a complete monster stat block
&lt;&lt;''monster-stat'' //tiddler//&gt;&gt; - Display a monster stat block without abilities and attack
&lt;&lt;''mobs'' //tiddlers//&gt;&gt; - Display monsters in a tab panel
&lt;&lt;''divider''&gt;&gt; - Insert a statblock divider
"""
R0lGODlhAAEAAYAAAAAAAAAAACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0PGZgUxIuz3rz7D4ZhRVbiiabqyrZRCVPuTNf2fcb6hPf+D2TthsGi8YhEDInJpvO5Wi6h1Kr1Mg0wr9wuVeeAecfkYwwiLqvXtbTCoiSx53SUO8HDm+r8vuZ+sBeX1yXnd5hRIiGjR1i1hRi5oDjJOAj3JSW52WjZ+ebpJBXKiUgJ6mggKDpKWup3eomKydqa+toXG0i6mgQIhnsIqBXa62u8axgMqxzXSXvseim9rHam9JyZeqtbPQf8fIu06trsTWdr3lTMi3y+li4e/Zn9vgF5k37Fzu1uv6jJR8B9noyp+1dJn0BwBB31OohwmsIeDBti4kctYrz+YTMqWlHmsFtEVRs5tvD4EZnJKCLHlWwpBOUjWx1brRtI8poNmTNxqihpBl+4jCl49txx8qW8NkJn+fups4xREEoh1pyazGrRqGRWjqgKMylXbEN3Yn3ilSrYtFtlttNqZywXth3WnhWBFCA0ul/53nz6wW5eGoPrSTQr9yhRD1mGNoWaWFfYuIm1Aa6LdWLMypLhUp4c5jFm0PfuEvMJ2eQvzzky22VMurTfnI1ZRu58ufVtwX4rw56dtbBtjqtz677DexSa2H+AS/StdjfGpcOTv07IujlM6qdF91XdzHlg69bLVpcGGPXnlubE/yafnLZx7f7gqscrPGu4H/D++zNPBF56taUGnnkU+YegWBBNdh9+d0FHIILwKUiNVw06OBWE60nYH4VLWXhhdPkFt9iGHHZ4HjQkcheiiEwM6OGJEkaoonxEteiiUojJyGNb7kCHY44b7chjj8ehByKMmwFFWJFOzhfagkmO6AKTVz2J5XcqTWnakTZViWWY3C3HXlhB0uidkGIWKaReFZ4JppJarpnle1s+BeeVXWJBZ592IvmmnPzl+UCfhtbIp0h4Ehpnmhgceuhoin7IaKNU0gcpnZKqQ2mlll76QqaQcgCqY+7p6aibovopG5BfWiZoA6uuSmpT8aREU6JhArhrqxNa9GqURmJ4Yq2/zjX+pKzDpogipoJ1ZeVzxzI1o69rSaWjtLwFUa2xYMFTlY3xuTSts7eiMysUzVobLLqZKvbspsqZEimy45pbah2s6sZstvhqqG+vG/YbbajtlvIkmgSf++jBuCw7Z3a8Xqurp+765+OeBn9bcawPrxsxwBOHS+a8I5GXscfe+qtsriOJ+xKa+bKbrKoqn3OdiRbbzLBTJr/cHcvEauZlzSvuHEnOQxO9dM9Buwz000Y3DXXREwn9MsU6M021jFEfzfV4HKfM5tcwVx1ywV0naLbUTqc99dogRz221TEvjHLbZzssdrxkY6z33kj7XPfW5QXuNtpqkizzvYEzbjjWcPv+jTjkdlt+eeGVS96345Fzrjfmi2v9edyIC37zyJ7L/fbpif+cueiTK+7664ObSnrpqYcO+p/b4p3q6bJ3vjrrGrc9vO+U6y7y5nf/rTTzp9Ldu7y/N76782rPXr31fNeuLezGb8/98WYn7330sc/sOvorF19+84+7/2/u48vPe/f1ax6/+dTrr7rlrS942iMf8dR3P/9ljX77e570CHg++43OgQ+EINAE2D/xJdCCJ8PgBE33wdbN73oD/N4B+Zc/D57QgCtkIELKlUH2NRCA9phbDPG3scOlMG8VnF7LbLhAwPVQYg3r1v+EOMQxvQ+GGikW9LJXRA4dUYpPlGH+FJ3YQa9hz4fY0WITy1ZFIl7RizWsUxiVSDMsvkNMeFtSwsrIxsa50Yze2JfO5kjHZYwqY3gUmB7fBZU+xvGPgCyEqOqYLlzRKhizKtFCGomopEESjURK5CsmKcYtFpITmPxPCffIyU7iMI2YvKQordixU0LJGqr0VCtvp65Xvk2WIOQDLW8JRknicpdskwQvfwlEWwKTl6gLmzCHecvwiTBgyKQl4SiYi2bKsosuHMO4pGlEZdLuYnXDZjBV+I3leZOHz6xlOO03TviBzZjn5F86wWk7E7IBgcV8p6PoyU1oatOeZ8FnO6vHT3OuU57zlCDuAhobgzKTfgjVYDn+2flPfVKzodnxZ0RZeNCAphKjBUUhzxA6RokutJoUrSg8LyrQh6YzpBxF6TJ/qNGNtrSjHoXpO1kq0mMqVFjjxOlMabpTm0pTpjmN5kknOkyi/tSlSx0oLpXaVKDWVKjEzKFFhaFOnp7hlFBNKb1I6NOQ9GibGY1qPoP60XKAjKD1fGkos5pWFhmUrfE0q1HBalUi1pKudXWrKXUY1rBy5kzk/AcTtarXsDkUqdVEWGFL9h8RLlalfsUZYGU6wzsREK6GvSxkV8k1wuI1gqNFLCX7Ko7JllW1U5xqOQOIEjhd9Wuc1RZs5SJa1+6QhjC77TBkq9sRBre3gjVI9hr+u9ulikxxubUr8tD6nOKq1YrIFR5JmcO34xYVfJSFIF9op12vcne1pvludr3r3PbRkC5kRW9lx9vd8pKmvcFLL3e3u6LPlip19r2veJ+m336yr7/g+yloyDrQrnKxwP9lEF9l+F/4MhbC9mGtMhWcSQk71bwCItSA36vh+Jq0wxx8HYZXGeK2GsfBUFxnXlucYq8eGMZgO/FpU6ziEs0Yla99MY9jXFnWlLjHhQIxjlGrYyEr0DE2juSRRZxkR/74oz5eMoMhCmAfK6zKoxxvkOdjZcI1+ckBzldiF8xkLntSwl925NnwKF03a9ivmexykUdsYSCzFcVS+5STyXv9Y//umc92vrOcEaxn1mbYbaiKc6DVS9BFi6tJh+aroHHE5+hS+rSI9jKiM70fav1ZxGTe8GJAHepNj3q1pUaywfi4I1LK2bqEjVA+Zh3PVufZUjjAte1KvWteWzPMWZxydYZd6AsO2Y3QQvMXiX0kZK85uahWULMlTVtow9qQ035usq3thW8XG9uiDrezn13tcnPb18JN96bN7W5ld/tAj6Y3u5MLLXjXu4CrnjO5vX1vWu+b3602TMGDdnD9JNxGCf93ARse8No5fIoLp4euI37lgWdb457muLz7TeZ4P7viPwy5x+Er8s6CvOApJ7n2XA7znMQ85ief+QwKAAA7
<$list filter="[all[current]tag[Monster]]">

|''Name'' |<$edit-text field=caption size=80/>|
|''Size'' |<$edit-text field=size size=60/>|
|''Type'' |<$edit-text field=mtype size=60 />|
|''Alignment'' |<$edit-text field=alignment size=60/>|
|''Source'' |<$edit-text field=source size=60/>|
|[img[divider.png]]|<|
|''Armor Class'' |<$edit-text field=ac size=8/>|
|''Armor'' |<$edit-text field=armor size=80/>|
|''Hitpoints'' |<$edit-text field=hp size=8/>|
|''Hit Dice'' |<$edit-text field=hitdice size=8/>|
|''Speed'' |<$edit-text field=speed size=80/>|
|[img[divider.png]]|<|
| <div style="display: flex"><div style="width: 60px; text-align: center;">''STR''<br/><$edit-text size=3 field=str/></div><div style="width: 60px; text-align: center;">''DEX''<br/><$edit-text size=3 field=dex/></div><div style="width: 60px; text-align: center;">''CON''<br/><$edit-text size=3 field=con/></div><div style="width: 60px; text-align: center;">''INT''<br/><$edit-text size=3 field=int/></div><div style="width: 60px; text-align: center;">''WIS''<br/><$edit-text size=3 field=wis/></div><div style="width: 60px; text-align: center;">''CHA''<br/><$edit-text size=3 field=cha/></div></div>|<|
|[img[divider.png]]|<|
|''Saving Throws'' |<$edit-text field=saving_throw size=80/>|
|''Skills'' |<$edit-text field=skills size=80/>|
|''Damage Vulnerabilities'' |<$edit-text field=damage_vulnerability size=80/>|
|''Damage Resistances'' |<$edit-text field=damage_resistance size=80/>|
|''Damage Immunities'' |<$edit-text field=damage_immunity size=80/>|
|''Condition Vulnerabilities'' |<$edit-text field=condition_vulnerability size=80/>|
|''Condition Immunities'' |<$edit-text field=condition_immunity size=80/>|
|''Senses'' |<$edit-text field=senses size=80/>|
|''Languages'' |<$edit-text field=languages size=80/>|
|''Challenge'' |<$edit-text field=cr size=3/>|
|''XP'' |<$edit-text field=xp size=12/>|
|''Proficiency Bonus'' |<$edit-text field=proficiency size=3/>|
|[img[divider.png]]|<|
</$list>
<$list filter="[<currentTab>tag[Monster]]"><$macrocall $name=monster tiddler=<<currentTab>> /></$list><$list filter="[<currentTab>!tag[Monster]]"><$transclude tiddler=<<currentTab>> field=text mode=block /></$list>
<$list filter="[all[current]tag[Monster]]">

<$list filter="[all[current]tag[Summoned]]">
<div style="width: 500px;">

|max top|k
| !Summoned Creature Parameters |<|
| !Proficiency Bonus | !Spell Level |
| <$edit-text field=proficiency/> | <$edit-text field=spell_level/> |
| !Caster DC | !Caster To-Hit |
| <$edit-text field=dc/> | <$edit-text field=to-hit/> |
</div></$list><div style="width: 500px;"><h2><$transclude field="caption"><$view field="title"/></$transclude></h2>
<div style="text-transform: initial;">//{{!!size}}, {{!!mtype}}, {{!!alignment}}//</div>
[img[divider.png]]
<div>''Armor Class'' {{!!ac}}<$reveal type="nomatch" state="!!armor" text=""> ({{!!armor}})</$reveal></div>
<div>''Hitpoints'' {{!!hp}} ({{!!hitdice}})</div>
<div>''Speed'' {{!!speed}}</div>
[img[divider.png]]
<div style="display: flex">
 <div style="width: 60px; text-align: center;">''STR''<br/>{{!!str}} (<$transclude tiddler=Modifiers index={{!!str}} />)</div>
 <div style="width: 60px; text-align: center;">''DEX''<br/>{{!!dex}} (<$transclude tiddler=Modifiers index={{!!dex}} />)</div>
 <div style="width: 60px; text-align: center;">''CON''<br/>{{!!con}} (<$transclude tiddler=Modifiers index={{!!con}} />)</div>
 <div style="width: 60px; text-align: center;">''INT''<br/>{{!!int}} (<$transclude tiddler=Modifiers index={{!!int}} />)</div>
 <div style="width: 60px; text-align: center;">''WIS''<br/>{{!!wis}} (<$transclude tiddler=Modifiers index={{!!wis}} />)</div>
 <div style="width: 60px; text-align: center;">''CHA''<br/>{{!!cha}} (<$transclude tiddler=Modifiers index={{!!cha}} />)</div>
</div>
[img[divider.png]]
<$reveal type="nomatch" state="!!saving_throw" text=""><div>''Saving Throws'' {{!!saving_throw}}</div></$reveal>
<$reveal type="nomatch" state="!!skills" text=""><div>''Skills'' {{!!skills}}</div></$reveal>
<$reveal type="nomatch" state="!!damage_vulnerability" text=""><div>''Damage Vulnerabilities'' {{!!damage_vulnerability}}</div></$reveal>
<$reveal type="nomatch" state="!!damage_resistance" text=""><div>''Damage Resistances'' {{!!damage_resistance}}</div></$reveal>
<$reveal type="nomatch" state="!!damage_immunity" text=""><div>''Damage Immunities'' {{!!damage_immunity}}</div></$reveal>
<$reveal type="nomatch" state="!!condition_vulnerability" text=""><div>''Condition Vulnerabilities'' {{!!condition_vulnerability}}</div></$reveal>
<$reveal type="nomatch" state="!!condition_immunity" text=""><div>''Condition Immunities'' {{!!condition_immunity}}</div></$reveal>
<$reveal type="nomatch" state="!!senses" text=""><div>''Senses'' {{!!senses}}</div></$reveal>
<$reveal type="nomatch" state="!!languages" text=""><div>''Languages'' {{!!languages}}</div></$reveal>
<div>''Challenge'' {{!!cr}} ({{!!xp}} XP)<$reveal type="nomatch" state="!!proficiency" text="">&nbsp;&nbsp;&nbsp;&nbsp;''Proficiency Bonus'' {{!!proficiency}}</$reveal></div>
[img[divider.png]]
</div>
</$list>
 Monstrosities are monsters in the strictest sense - frightening creatures that are not ordinary, not truly natural, and almost never benign. Some are the results of magical experimentation gone awry (such as owl bears), and others, are the product of terrible curses (including minotaurs and yuan-ti). They defy categorization, and in some sense serve as a catch-all category for creatures that don't fit into any other type.

<<list-box "[tag[Monstrosity]sort[]]" "No monstrosities found.">>
A silvery beam of pale light shines down in a 5-foot radius, 40-foot-high cylinder centered on a point within range. Until the spell ends, dim light fills the cylinder.

When a creature enters the spell’s area for the first time on a turn or starts its turn there, it is engulfed in ghostly flames that cause searing pain, and it must make a Constitution saving throw. It takes 2d10 radiant damage on a failed save, or half as much damage on a successful one.

A shapechanger makes its saving throw with disadvantage. If it fails, it also instantly reverts to its original form and can’t assume a different form until it leaves the spell’s light.

On each of your turns after you cast this spell, you can use an action to move the beam 60 feet in any direction.
| !Druid Level | !Spells |
| !3rd |[[Spider Climb]], [[Spike Growth]] |
| !5th |[[Lightning Bolt]], [[Meld into Stone]] |
| !7th |[[Stone Shape]], [[Stoneskin]] |
| !9th |[[Passwall]], [[Wall of Stone]] |
Choose an area of terrain no larger than 40 feet on a side within range. You can reshape dirt, sand, or clay in the area in any manner you choose for the duration. You can raise or lower the area's elevation, create or fill in a trench, erect or flatten a wall, or form a pillar. The extent of any such changes can't exceed half the area's largest dimension. So, if you affect a 40-foot square, you can create a pillar up to 20 feet high, raise or lower the square's elevation by up to 20 feet, dig a trench up to 20 feet deep, and so on. It takes 10 minutes for these changes to complete.

At the end of every 10 minutes you spend concentrating on the spell, you can choose a new area of terrain to affect.

Because the terrain's transformation occurs slowly, creatures in the area can't usually be trapped or injured by the ground's movement.

This spell can't manipulate natural stone or stone construction. Rocks and structures shift to accommodate the new terrain. If the way you shape the terrain would make a structure unstable, it might collapse.

Similarly, this spell doesn't directly affect plant growth. The moved earth carries any plants along with it.
<<vtabs "[tag[Rule]tag[Movement]nsort[order]]">>
<<p "Walking">>
<<p "Burrowing">>
<<p "Climbing">>
<<p "Flying">>
<<p "Swimming">>
"""
''Beast of Burden.'' The mule is considered to be a Large animal for the purpose of determining its carrying capacity.
''Sure-Footed.'' The mule has advantage on Strength and Dexterity saving throws made against effects that would knock it [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +2>>|<<bludgeoning 1d4+2>> |<<reach 5>> |
At 11th level, you gain one of the following features of your choice.

''Volley.'' You can use your action to make a ranged attack against any number of creatures within 10 feet of a point you can see within your weapon’s range. You must have ammunition for each target, as normal, and you make a separate attack roll for each target.

''Whirlwind Attack.'' You can use your action to make a melee attack against any number of creatures within 5 feet of you, with a separate attack roll for each target.
When a creature hits you with an attack, you gain a +4 bonus to AC against all subsequent attacks made by that creature for the rest of the turn.

''Multiattack.'' The mummy can use its Dreadful Glare and makes one attack with its rotting fist.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Rotting Fist" +5>>|<<bludgeoning 2d6+3>> + <<necrotic 3d6>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Con 12>> or be cursed with mummy rot. The cursed target can’t regain hit points, and its hit point maximum decreases by <<damage 3d6>> for every <<time 24h>> that elapse. If the curse reduces the target’s hit point maximum to <<hp 0>>, the target dies, and its body turns to dust. The curse lasts until removed by the [[Remove Curse]] spell or other magic. |<|
| !Dreadful Glare|The mummy targets one creature it can see within <<range 60>> of it. If the target can see the mummy, it must succeed on a <<save Wis 11>> against this magic or become [[Frightened]] until the end of the mummy’s next turn. If the target fails the saving throw by 5 or more, it is also [[Paralyzed]] for the same duration. A target that succeeds on the saving throw is immune to the Dreadful Glare of all mummies (but not mummy lords) for the next <<time 24h>>. |<|
"""
''Magic Resistance.'' The mummy lord has advantage on saving throws against spells and other magical effects.
''Rejuvenation.'' A destroyed mummy lord gains a new body in <<time 24h>> if its heart is intact, regaining all its hit points and becoming active again. The new body appears within 5 feet of the mummy lord’s heart.
''Spellcasting.'' The mummy lord is a 10th-level spellcaster. Its spellcasting ability is Wisdom (<<save DC 17>>, <<casted +9>>). The mummy lord has the following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Sacred Flame]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Command]], [[Guiding Bolt]], [[Shield of Faith]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Hold Person]], [[Silence]], [[Spiritual Weapon]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Animate Dead]], [[Dispel Magic]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Divination]], [[Guardian of Faith]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (2 slots):'' [[Contagion]], [[Insect Plague]]
&nbsp;&nbsp;&nbsp;&nbsp;''6th level (1 slot):'' [[Harm]]
"""
<<divider>>
''Multiattack.'' The mummy can use its Dreadful Glare and makes one attack with its rotting fist.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Rotting Fist" +9>>|<<bludgeoning 3d6+4>> + <<necrotic 6d6>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Con 16>> or be cursed with mummy rot. The cursed target can’t regain hit points, and its hit point maximum decreases by <<damage 3d6>> for every <<time 24h>> that elapse. If the curse reduces the target’s hit point maximum to <<hp 0>>, the target dies, and its body turns to dust. The curse lasts until removed by the [[Remove Curse]] spell or other magic. |<|
| !Dreadful Glare|The mummy lord targets one creature it can see within <<range 60>> of it. If the target can see the mummy lord, it must succeed on a <<save Wis 16>> against this magic or become [[Frightened]] until the end of the mummy’s next turn. If the target fails the saving throw by 5 or more, it is also [[Paralyzed]] for the same duration. A target that succeeds on the saving throw is immune to the Dreadful Glare of all mummies and mummy lords for the next <<time 24h>>. |<|
| !<<action>> Legendary Actions (3/round) |<|<|
| !Attack|The mummy lord makes one attack with its rotting fist or uses its Dreadful Glare. |<|
| !Blinding Dust|Blinding dust and sand swirls magically around the mummy lord. Each creature within <<range 5>> of the mummy lord must succeed on a <<save Con 16>> or be [[Blinded]] until the end of the creature’s next turn. |<|
| !Blasphemous Word|''Costs 2 Actions.''<br/>The mummy lord utters a blasphemous word. Each non-undead creature within <<range 10>> of the mummy lord that can hear the magical utterance must succeed on a <<save Con 16>> or be [[Stunned]] until the end of the mummy lord’s next turn. |<|
| !Channel Negative Energy|''Costs 2 Actions.''<br/>The mummy lord magically unleashes negative energy. Creatures within <<range 60>> of the mummy lord, including ones behind barriers and around corners, can’t regain hit points until the end of the mummy lord’s next turn. |<|
| !Whirlwind of Sand|''Costs 2 Actions.''<br/>The mummy lord magically transforms into a whirlwind of sand, moves up to 60 feet, and reverts to its normal form. While in whirlwind form, the mummy lord is immune to all damage, and it can’t be grappled, petrified, knocked prone, restrained, or stunned. Equipment worn or carried by the mummy lord remain in its possession. |<|
| !<<action>> Lair Actions @ Initiative 20 |<|<|
|Each undead creature in the lair can pinpoint the location of each living creature within 120 feet of it until initiative count 20 on the next round. |<|<|
|Each undead in the lair has advantage on saving throws against effects that turn undead until initiative count 20 on the next round. |<|<|
|Until initiative count 20 on the next round, any non-undead creature that tries to cast a spell of 4th level or lower in the mummy lord’s lair is wracked with pain. The creature can choose another action, but if it tries to cast the spell, it must make a <<save Con 16>>, <fail><<necrotic "1d6/spell level">> + spell has no effect</fail>. |<|<|
When opened, this music box plays a single song at a moderate volume. 
The box stops playing when it reaches the song’s end or when it is closed.
Several of the most common types of musical instruments are shown on the table as examples. If you have proficiency with a given musical instrument, you can add your proficiency bonus to any ability checks you make to play music with the instrument. A bard can use a musical instrument as a spellcasting focus, as described in chapter 10. Each type of musical instrument requires a separate proficiency.

Proficiency with a musical instrument indicates you are familiar with the techniques used to play it. You also have knowledge of some songs commonly performed with that instrument.

''History.'' Your expertise aids you in recalling lore related to your instrument.

''Performance.'' Your ability to put on a good show is improved when you incorporate an instrument into your act.

''Compose a Tune.'' As part of a long rest, you can compose a new tune and lyrics for your instrument. You might use this ability to impress a noble or spread scandalous rumors with a catchy tune.

| !Activity | !DC |
|!Identify a tune | 10 |
|!Improvise a tune | 20 |
At 11th level, your patron bestows upon you a magical secret called an arcanum. Choose one 6th-level spell from the warlock spell list as this arcanum.

You can cast your arcanum spell once without expending a spell slot. You must finish a long rest before you can do so again.

At higher levels, you gain more warlock spells of your choice that can be cast in this way: one 7th-level spell at 13th level, one 8th-level spell at 15th level, and one 9th-level spell at 17th level. You regain all uses of your Mystic Arcanum when you finish a long rest.

At 13th level, your patron bestows upon you a magical secret called an arcanum. Choose one 7th-level spell from the warlock spell list as this arcanum.

You can cast your arcanum spell once without expending a spell slot. You must finish a long rest before you can do so again.

At higher levels, you gain more warlock spells of your choice that can be cast in this way: one 8th-level spell at 15th level, and one 9th-level spell at 17th level. You regain all uses of your Mystic Arcanum when you finish a long rest.
At 15th level, your patron bestows upon you a magical secret called an arcanum. Choose one 8th-level spell from the warlock spell list as this arcanum.

You can cast your arcanum spell once without expending a spell slot. You must finish a long rest before you can do so again.

At 17th level, you gain a 9th-level warlock spell of your choice that can be cast in this way. You regain all uses of your Mystic Arcanum when you finish a long rest.
At 17th level, your patron bestows upon you a magical secret called an arcanum. Choose one 9th-level spell from the warlock spell list as this arcanum.

You can cast your arcanum spell once without expending a spell slot. You must finish a long rest before you can do so again.

You regain all uses of your Mystic Arcanum when you finish a long rest.
"""
''Magic Resistance.'' The nalfeshnee has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The nalfeshnee uses Horror Nimbus if it can. It then makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +10>>|<<piercing 5d10+5>> |<<reach 5>> |
| !<<melee Claw +10>>|<<slashing 3d6+5>> |<<reach 10>> |
| !Horror Nimbus|''Recharge on 5–6''<br/>The nalfeshnee magically emits scintillating, multicolored light. Each creature within <<range 15>> of the nalfeshnee that can see the light must succeed on a <<save Wis 15>> or be [[Frightened]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to the nalfeshnee’s Horror Nimbus for the next <<time 24h>>. |<|
| !Teleport|The nalfeshnee magically teleports, along with any equipment it is wearing or carrying, up to <<range 120>> to an unoccupied space it can see. |<|
You are particularly familiar with one type of natural environment and are adept at traveling and surviving in such regions. Choose one type of favored terrain: arctic, coast, desert, forest, grassland, mountain, swamp, or the Underdark. When you make an Intelligence or Wisdom check related to your favored terrain, your proficiency bonus is doubled if you are using a skill that you’re proficient in.

While traveling for an hour or more in your favored terrain, you gain the following benefits:

* Difficult terrain doesn’t slow your group’s travel.
* Your group can’t become lost except by magical means.
* Even when you are engaged in another activity while traveling (such as foraging, navigating, or tracking), you remain alert to danger.
* If you are traveling alone, you can move stealthily at a normal pace.
* When you forage, you find twice as much food as you normally would.
* While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.

You choose additional favored terrain types at 6th and 10th level.
Starting at 2nd level, you can regain some of your magical energy by sitting in meditation and communing with nature. During a short rest, you choose expended spell slots to recover. The spell slots can have a combined level that is equal to or less than half your druid level (rounded up), and none of the slots can be 6th level or higher. You can’t use this feature again until you finish a long rest

For example, when you are a 4th-level druid, you can recover up to two levels worth of spell slots. You can recover either a 2nd-level slot or two 1st-level slots.

You can attempt to hide even when you are obscured only by a creature that is at least one size larger than you.
"""
''Replaces the [[Hide in Plain Sight]] feature''
"""

You draw on the powers of nature to hide yourself from view briefly. As a bonus action, you can magically become invisible, along with any equipment you are wearing or carrying, until the start of your next turn.

You can use this feature a number of times equal to your proficiency bonus, and you regain all expended uses when you finish a long rest.
When you reach 14th level, creatures of the natural world sense your connection to nature and become hesitant to attack you. When a beast or plant creature attacks you, that creature must make a Wisdom saving throw against your druid spell save DC. On a failed save, the creature must choose a different target, or the attack automatically misses. On a successful save, the creature is immune to this effect for 24 hours.

The creature is aware of this effect before it makes its attack against you.
When you reach 10th level, you can’t be [[Charmed]] or [[Frightened]] by elementals or fey, and you are immune to poison and disease.

This set of instruments is used for navigation at sea. Proficiency with navigator's tools lets you chart a ship's course and follow navigation charts. In addition, these tools allow you to add your proficiency bonus to any ability check you make to avoid getting lost at sea.

Proficiency with navigator’s tools helps you determine a true course based on observing the stars. It also grants you insight into charts and maps while developing your sense of direction.

''Components.'' Navigator’s tools include:

* a sextant
* a compass
* calipers
* a ruler
* parchment
* ink
* a quill

''Survival.'' Knowledge of navigator’s tools helps you avoid becoming lost and also grants you insight into the most likely location for roads and settlements.

''Sighting.'' By taking careful measurements, you can determine your position on a nautical chart and the time of day.

| !Activity | !DC |
|!Plot a course | 10 |
|!Discover your position on a nautical chart | 15 |

While wearing this necklace, you can breathe normally in any environment, and you have advantage on saving throws made against harmful gases and vapors (such as [[Cloudkill]] and [[Stinking Cloud]] effects, inhaled poisons, and the breath weapons of some dragons).
This necklace has <<roll 1d6+3>> beads hanging from it. You can use an action to detach a bead and throw it up to 60 feet away. When it reaches the end of its trajectory, the bead detonates as a 3rd-level [[Fireball]] spell (<<save "Spell DC" 15>>).

You can hurl multiple beads, or even the whole necklace, as one action. When you do so, increase the level of the [[Fireball]] by 1 for each bead beyond the first.
This necklace has <<roll 1d4+2>> magic beads made from aquamarine, black pearl, or topaz. It also has many nonmagical beads made from stones such as amber, bloodstone, citrine, coral, jade, pearl, or quartz. If a magic bead is removed from the necklace, that bead loses its magic.

Six types of magic beads exist. The DM decides the type of each bead on the necklace or determines it randomly. A necklace can have more than one bead of the same type. To use one, you must be wearing the necklace. Each bead contains a spell that you can cast from it as a bonus action (using your spell save DC if a save is necessary). Once a magic bead’s spell is cast, that bead can’t be used again until the next dawn.

| !d20 | !Bead of ... | !Spell |
| !1-6 |Blessing |[[Bless]] |
| !7-12 |Curing |[[Cure Wounds]] (2nd level) or [[Lesser Restoration]] |
| !13-16 |Favor |[[Greater Restoration]] |
| !17-18 |Smiting |[[Branding Smite]] |
| !19 |Summons |[[Planar Ally]] |
| !20 |Wind walking |[[Wind Walk]] |
"""
''Innate Spellcasting.'' The hag’s innate spellcasting ability is Charisma (<<save "Spell DC" 14>>, <<casted "" +6>>). She can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Magic]], [[Magic Missile]]
&nbsp;&nbsp;&nbsp;&nbsp;''2/day each:'' [[Plane Shift]] (self only), [[Ray of Enfeeblement]], [[Sleep]]
''Magic Resistance.'' The hag has advantage on saving throws against spells and other magical effects.
''Night Hag Items.'' A night hag carries two very rare magic items that she must craft for herself. If either object is lost, the night hag will go to great lengths to retrieve it, as creating a new tool takes time and effort.
&nbsp;&nbsp;&nbsp;&nbsp;''Heartstone.'' This lustrous black gem allows a night hag to become ethereal while it is in her possession. The touch of a heartstone also cures any disease. Crafting a heartstone takes <<time 30d>>.
&nbsp;&nbsp;&nbsp;&nbsp;''Soul Bag.'' When an evil humanoid dies as a result of a night hag’s Nightmare Haunting, the hag catches the soul in this black sack made of stitched flesh. A soul bag can hold only one evil soul at a time, and only the night hag who crafted the bag can catch a soul with it. Crafting a soul bag takes <<time 7d>> and a humanoid sacrifice (whose flesh is used to make the bag).
"""
{{Hag Shared Spellcasting}}
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +7>>|<<slashing 2d8+4>> |<<reach 5>> |
|~|''Hag Form Only'' |<|
| !Change Shape|The hag magically polymorphs into a Small or Medium female humanoid, or back into her true form. Her statistics are the same in each form. Any equipment she is wearing or carrying isn’t transformed. She reverts to her true form if she dies. |<|
| !Etherealness|The hag magically enters the Ethereal Plane from the Material Plane, or vice versa. To do so, the hag must have a heartstone in her possession. |<|
| !Nightmare Haunting|''1/Day''<br/>While on the Ethereal Plane, the hag magically touches a sleeping humanoid on the Material Plane. A [[Protection from Evil and Good]] spell cast on the target prevents this contact, as does a [[Magic Circle]]. As long as the contact persists, the target has dreadful visions. If these visions last for at least <<time 1h>>, the target gains no benefit from its rest, and its hit point maximum is reduced by <<damage 1d10>>. If this effect reduces the target’s hit point maximum to 0, the target dies, and if the target was evil, its soul is trapped in the hag’s soul bag. The reduction to the target’s hit point maximum lasts until removed by the [[Greater Restoration]] spell or similar magic. |<|

"""
''Confer Fire Resistance.'' The nightmare can grant resistance to fire damage to anyone riding it.
''Illumination.'' The nightmare sheds <<bright 10>> and an additional <<dim 10>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +6>>|<<bludgeoning 2d8+4>> + <<fire 2d6>> |<<reach 5>> |
| !Ethereal Stride|The nightmare and up to three willing creatures within 5 feet of it magically enter the Ethereal Plane from the Material Plane, or vice versa. |<|
You gain a +2 bonus to attack and damage rolls made with this magic weapon.

The sword has <<roll 1d8+1>> charges. If you score a critical hit against a creature that has <<hp "&lt;100">>, it must succeed on a <<save Con 15>> or be slain instantly as the sword tears its life force from its body (a construct or an undead is immune). The sword loses 1 charge if the creature is slain. When the sword has no charges remaining, it loses this property.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Rapier +3>>|<<piercing 1d8+1>> |<<reach 5>> |
| !<<reaction>> Reactions |<|<|
| !Parry|The noble adds <<ac +2>> against one melee attack that would hit it. To do so, the noble must see the attacker and be wielding a melee weapon. |<|
For the duration, you hide a target that you touch from divination magic.
The target can be a willing creature or a place or an object no larger than 10 feet in any dimension. The target can’t be targeted by any divination magic or perceived through magical scrying sensors.
<<vtabs "[tag[Note]sort[]]">>
R0lGODlhAAEAAYABAAAAAP///yH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yutwoIi8fkstn8TaPO7LYboI6H3vR6WI7f2PfvvN/CF3j2RygheDhWqNiA2Hi3CHng2BhZOYlYGXl5mAm5Kdi5+BkYqjjKV1p4updKaDfx2uoXG0ErK2f7kHubtstYx4vnyzAcvFWsgGyMpYzQvAwGbCgN7fVscF0dlZ2t/cRN7a0FTifORd5nPh6uy64eXT4d/36F7kYvv6qPmb/vz4rkn0BS/QYaZGPkoMJ7BRc6hDPkocREDScejGhRIqz+jA+FcNRY8aM/jyIXbix5EQhKhSdXCgzi0mDLmPtg0vw38+Ypmzr15ey5iSfQUT+HOhJq9FLRpJxUMg0a8ikqp/N62GtDNd2PbjCuItzqbgfXF14Hga1qNWyOsmjOavUx1gXbMlkZurWbFq2DuC349lWLYy4ZpF/vYjVcGIJfFoADN7YhmCLitpMp533bTq9YzToWq4gshrDZynRJD4562nTouofhPnb2ukZsGp5TgH6kGrdrzo55J5s9A7iM2muAEy+OmcdxExZFj76cfO1E55aVLyfRnHVi68LJTtf+nLtv2d/Bl949nnb53BDRR+/dkXpq6Hg3gzQ/X/x7+Cz+SaYPDhB9Mvm3H2QB6peSfPl1diCCL2H033ANOlhTEd3JNaGARB1x4V/X4bNXhDFMBeIJH85BYonYdbgCQSquKKJ3Gb74AYufpUgjigWqN2OOHJxYo4s+Bhmjhz0OiQGQHoCCJAg2Indkk4AUyZiQUurxJHNMXokllTdayeUFSv64ZZgZZFlCU2aeieYI/DAh1ZJtivBmElJJxqaXUOKY0J14Jjmnk2py6OeCFYyZZ5kWFvrnlHpqOeiijOomZqBEKgrhpJQ6uiOGkWaqaZedGokpgYyS+SiMn5paKKqp0kkJoaG6Wh+AsfZ5ageIcroqq0xdOuqXdcqaFKyvCnr+1JqAHgtsr8oqtutSUT5LTLSoWYsPttBOQi2vtcqYbLfSniehUuKO2yi44Z67LbOirstuZsFCam688s6rKrf23vttlZ/sy29r6uoLcLWWegtvwQlou8AqChvsbqUbPrwwwxXvlKamCSIcnr99KKlxfIdaLAkw03Ic8oMjR7xyOh+mvN616e552MnowuxTy/g2+5XNMuOMsc790mvXckDfd/NqHhd93NEiU+CznFUZ7fTGUFtsS9QhVj1Qoju/K3AATXPd9bIst1uf1r+QXaHXQxubHNVsB+122ETbrfbWcydc93YZa0ayOHlLHN3gyhp+NeCIh7n4z+1dfPaQjaP+bTc2k0vJp477Xd5k5sgWyDmSnksNeuiSI6qM6T6OTmvlsAWujeolpyc7jaxr0Mzt9upO+NuzR54j7yiTu/bBq6t+jfDnKu940ps+zHwtxtUuttM3RB9wx3pHPjd5nHeDffZHex8oV+FD3D2Pc451/m97Pz5i+69/DWbvbBtIXFzyW/7+8wP7Lj0v1S9x/cOfZ/gyQOeFjD9fgxwAi/eq/sFPfanySwIDuDfpGG4xF6Rc1eyDwCx1UHwwo9AD3dfA+aHpg+4R4Ar3d6URovCEJNRewWSoQtcNz4b7KhUEdSi0FJoJh/wT4gyB9yIiXoeI3cLhy2DYORk+EYqiG+H+iXzYww4CCYu7uyDImHg4LH6Riqcb3ZicFa9VoQ6MYczcrriYRjBFC47LU5S1JIjHdWErj3zc0h77CMhYaCuQhPyY8bZXyETeAWuKbCQZFehIRf4vkpRUGqkqicn4YRKP1UOi4zaZsk4aUVegzKAoafi3UrLwlEBcmioXmEO/UQx2QeThDQ8JN1SKi5YE1GUTcak5X1KLl86j2BFlySBPJhGYnxPms4jZPGPG0pbXY6aKoIlBZ7ZxlMLS5pqw6UFqZlGZPBNnF8lJOm8O0ZrpbOU4uWmbV5qSPfKcFT3rmat74tNPCtqnPVvozxLiJ6CT6idB+TnQg94JVAotqK8zGorQh0L0V5KaaJwCYtFiSXOjHO2oRz8K0pCKdKQkLalJT4rSlKp0pSxtqUtfCtOYZqAAADs=
<<list-icons "[tag[Hardcover]sort[published]]" "0 NPCs found.">>
The Oath of Devotion binds a paladin to the loftiest ideals of justice, virtue, and order. Sometimes called cavaliers, white knights, or holy warriors, these paladins meet the ideal of the knight in shining armor, acting with honor in pursuit of justice and the greater good. They hold themselves to the highest standards of conduct, and some, for better or worse, hold the rest of the world to the same standards. Many who swear this oath are devoted to gods of law and good and use their gods’ tenets as the measure of their devotion. They hold angels—the perfect servants of good—as their ideals, and incorporate images of angelic wings into their helmets or coats of arms.

{{||PaladinAdvancementTemplate}}
{{||ClassAbilityTemplate}}
| !Level | !Proficiency<br/>Bonus | !Features | !—Spell Slots per Spell Level— |<|<|<|<|
|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |[[Divine Sense]], [[Lay on Hands]] | — | — | — | — | — |
| !2nd | +2 |[[Fighting Style|Paladin Fighting Style]], [[Spellcasting|Paladin Spellcasting]], [[Divine Smite]] | 2 | — | — | — | — |
| !3rd | +2 |[[Divine Health]], ''Devotion:'' [[Oath Spells|Oath of Devotion Oath Spells]], [[Channel Divinity|Oath of Devotion Channel Divinity]] | 3 | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 3 | — | — | — | — |
| !5th | +3 |[[Extra Attack|Paladin Extra Attack]] | 4 | 2 | — | — | — |
| !6th | +3 |[[Aura of Protection]] | 4 | 2 | — | — | — |
| !7th | +3 |''Devotion:'' [[Aura of Devotion]] | 4 | 3 | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Paladin Ability Score Improvement]] |  4 | 3 | — | — | — |
| !9th | +4 | — | 4 | 3 | 2 | — | — |
| !10th | +4 |[[Aura of Courage]] | 4 | 3 | 2 | — | — |
| !11th | +4 |[[Improved Divine Smite]] | 4 | 3 | 3 | — | — |
| !12th | +4 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | — | — |
| !13th | +5 | — | 4 | 3 | 3 | 1 | — |
| !14th | +5 |[[Cleansing Touch]] | 4 | 3 | 3 | 1 | — |
| !15th | +5 |''Devotion:'' [[Purity of Spirit]] | 4 | 3 | 3 | 2 | — |
| !16th | +5 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | 2 | — |
| !17th | +6 | — | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |[[Aura Improvements]] | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |''Devotion:'' [[Holy Nimbus]] | 4 | 3 | 3 | 3 | 2 |
When you take this oath at 3rd level, you gain the following two Channel Divinity options.

<<p "Sacred Weapon">>
<<p "Turn the Unholy">>
You gain oath spells at the paladin levels listed.

| !Paladin Level | !Spells |
| !3rd |[[Protection from Evil and Good]], [[Sanctuary]] |
| !5th |[[Lesser Restoration]], [[Zone of Truth]] |
| !9th |[[Beacon of Hope]], [[Dispel Magic]] |
| !13th |[[Freedom of Movement]], [[Guardian of Faith]] |
| !17th |[[Commune]], [[Flame Strike]] |

When you nock an arrow on this bow, it whispers in Elvish, “Swift defeat to my enemies.” When you use this weapon to make a ranged attack, you can, as a command phrase, say, “Swift death to you who have wronged me.” The target of your attack becomes your sworn enemy until it dies or until dawn seven days later. You can have only one such sworn enemy at a time. When your sworn enemy dies, you can choose a new one after the next dawn.

When you make a ranged attack roll with this weapon against your sworn enemy, you have advantage on the roll. In addition, your target gains no benefit from cover, other than [[Total Cover]], and you suffer no disadvantage due to long range. If the attack hits, your sworn enemy takes an extra <<piercing 3d6>>.

While your sworn enemy lives, you have disadvantage on attack rolls with all other weapons.
When characters need to saw through ropes, shatter a window, or smash a vampire’s coffin, the only hard and fast rule is this: given enough time and the right tools, characters can destroy any destructible object.

Use common sense when determining a character’s success at damaging an object. Can a fighter cut through a section of a stone wall with a sword? No, the sword is likely to break before the wall does.

For the purpose of these rules, an object is a discrete, inanimate item like a window, door, sword, book, table, chair, or stone, not a building or a vehicle that is composed of many other objects.

* ''Statistics for Objects''. When time is a factor, objects can be assigned these statistics. Use your best judgement; a pick can chip away at stone but can't effectively cut down a tree. 
** Armor Class
** Hit Points
** Damage Resistance
** Damage Immunity. Objects are immune to poison and psychic damage.
** Damage Vulnerability
*** Bludgeoning works well for smashing things, but not for cutting rope or leather.
*** Fire or lightning work well against paper or cloth objects.
** Damage Threshold
*** An object with a damage threshold has immunity to all damage unless it takes an amount of damage from a single attack or effect equal to or greater than its damage threshold, in which case it takes damage as normal. Any damage that fails to meet or exceed the object’s damage threshold is considered superficial and doesn’t reduce the object’s hit points.
* ''Huge and Gargantuan Objects''
** Normal weapons are of little use against many Huge and Gargantuan objects, such as a colossal statue, towering column of stone, or massive boulder.
** Instead of tracking hit points, simply decide how long the object can withstand whatever weapon or force is acting against it.
** If tracking hit points, divide it into Large or smaller sections, and track each section’s hit points separately. 
*** Destroying one of those sections could ruin the entire object. For example, a Gargantuan statue of a human might topple over when one of its Large legs is reduced to 0 hit points.

!! Object Armor Class

| !Substance | !AC |
|!Cloth, paper, rope | 11 |
|!Crystal, glass, ice | 13 |
|!Wood, bone | 15 |
|!Stone | 17 |
|!Iron, steel | 19 |
|!Mithral | 21 |
|!Adamantine | 23 |

!! Object Hit Points

| !Size | !Fragile | !Resilient |
|!Tiny (bottle, lock) |2 (1d4) |5 (2d4) |
|!Small (chest, lute) |3 (1d6) |10 (3d6) |
|!Medium (barrel, chandelier) |4 (1d8) |18 (4d8) |
|!Large (cart, 10 ft. by 10 ft. window) |5 (1d10) |27 (5d10) |

The most fundamental tasks of adventuring — noticing danger, finding hidden objects, hitting an enemy in combat, and targeting a spell, to name just a few — rely heavily on a character's ability to see. Darkness and other effects that obscure vision can prove a significant hindrance.

|^!{{Lightly Obscured||Link}} |{{Lightly Obscured}} |
|^!{{Heavily Obscured||Link}} |{{Heavily Obscured}} |
"""
''Amorphous.'' The jelly can move through a space as narrow as 1 inch wide without squeezing.
''Spider Climb.'' The jelly can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Pseudopod +4>>|<<bludgeoning 2d6+2>> + <<acid 1d6>> |<<reach 5>> |
| !<<reaction>> Reactions |<|<|
| !Split|When a jelly that is Medium or larger is subjected to lightning or slashing damage, it splits into two new jellies if it has <<hp &gt;10>>. Each new jelly has hit points equal to half the original jelly’s, rounded down. New jellies are one size smaller than the original jelly. |<|
"""
''Hold Breath.'' While out of water, the octopus can hold its breath for <<time 30m>>.
''Underwater Camouflage.'' The octopus has advantage on Dexterity (Stealth) checks made while underwater.
''Water Breathing.'' The octopus can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Tentacles +4>>|<<bludgeoning 1>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 10>>). Until this grapple ends, the octopus can’t use its tentacles on another target. |<|
| !Ink Cloud|''Recharges after a Short or Long Rest.''<br/>A <<sphere 5>> cloud of ink extends all around the octopus if it is underwater. The area is [[Heavily Obscured]] for <<time 1m>>, although a significant current can disperse the ink. After releasing the ink, the octopus can use the Dash action as a bonus action. |<|
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatclub +6>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
| !<<ranged Javelin +6>>|<<piercing 2d6+4>> |<<reach 5>><br/><<range 30/120>> |
"""
''Undead Fortitude.'' If damage reduces the zombie to <<hp 0>>, it must make a <<save Con "5+damage taken">>, unless the damage is <<radiant radiant>> or from a ''critical hit''. On a success, the zombie drops to <<hp 1>> instead.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Morningstar +6>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
Beads of this cloudy gray oil form on the outside of its container and quickly evaporate. The oil can cover a Medium or smaller creature, along with the equipment it’s wearing and carrying (one additional vial is required for each size category above Medium). Applying the oil takes <<time 10m>>. The affected creature then gains the effect of the [[Etherealness]] spell for <<time 1h>>.
This clear, gelatinous oil sparkles with tiny, ultrathin silver shards. The oil can coat one slashing or piercing weapon or up to 5 pieces of slashing or piercing ammunition. Applying the oil takes <<time 1m>>. For <<time 1h>>, the coated item is magical and has a +3 bonus to attack and damage rolls.
This sticky black unguent is thick and heavy in the container, but it flows quickly when poured. The oil can cover a Medium or smaller creature, along with the equipment it’s wearing and carrying (one additional vial is required for each size category above Medium). Applying the oil takes <<time 10m>>. The affected creature then gains the effect of a [[Freedom of Movement]] spell for <<time 8h>>.

Alternatively, the oil can be poured on the ground as an action, where it covers a <<square 10>>, duplicating the effect of the [[Grease]] spell in that area for <<time 8h>>.
"""
''Price per Dose:'' 400 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 13>> or become [[Poisoned]] for <<time 24h>>. 
** The poisoned creature is [[Unconscious]]. 
** The creature wakes up if it takes damage.
''Prerequisite:'' 5th level

When you are in an area of dim light or darkness, you can use your action to become invisible until you move or take an action or a reaction.

"""
''Innate Spellcasting.'' The oni’s innate spellcasting ability is Charisma (<<save "Spell DC" 13>>). The oni can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Darkness]], [[Invisibility]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Charm Person]], [[Cone of Cold]], [[Gaseous Form]], [[Sleep]]
''Magic Weapons.'' The oni’s weapon attacks are magical.
''Regeneration.'' The oni regains <<heal +10>> at the start of its turn if it has at least <<hp 1>>.
"""
<<divider>>
''Multiattack.'' The oni makes two attacks, either with its claws or its glaive.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +7>><br/>''Oni Form Only''|<<slashing 1d8+4>> |<<reach 5>> |
| !<<melee Glaive +7>>|<<slashing 2d10+4>><br/><<slashing 1d10+4>> (''Small/Medium Form'') |<<reach 10>> |
| !Change Shape|The oni magically polymorphs into a Small or Medium humanoid, into a Large giant, or back into its true form. Other than its size, its statistics are the same in each form. The only equipment that is transformed is its glaive, which shrinks so that it can be wielded in humanoid form. If the oni dies, it reverts to its true form, and its glaive reverts to its normal size. |<|
Oozes are gelatinous creatures that rarely have a fixed shape . They are mostly  subterranean, dwelling in caves and dungeons and feeding on refuse, carrion, or creatures unlucky enough to get in their way. Black puddings and gelatinous cubes are among the most recognizable oozes.

<<list-box "[tag[Ooze]sort[]]" "No oozes found.">>
Starting when you choose this tradition at 3rd level, you can manipulate your enemy’s [[Ki]] when you harness your own. Whenever you hit a creature with one of the attacks granted by your [[Flurry of Blows]], you can impose one of the following effects on that target:

* It must succeed on a Dexterity saving throw or be knocked prone.
* It must make a Strength saving throw. If it fails, you can push it up to 15 feet away from you.
* It can’t take reactions until the end of your next turn.
In a fight, everyone is constantly watching for a chance to strike an enemy who is fleeing or passing by. Such a strike is called an opportunity attack. 

You can make an opportunity attack when a hostile creature that you can see moves out of your reach. To make the opportunity attack, you use your reaction to make one melee attack against the provoking creature. The attack occurs right before
the creature leaves your reach.

You can avoid provoking an opportunity attack by taking the Disengage action. You also don’t provoke an opportunity attack when you teleport or when someone or something moves you without using your movement, action, or reaction. For example, you don’t provoke an opportunity attack if an explosion hurls you out of a foe’s reach or if gravity causes you to fall past an enemy.
"""
''Aggressive.'' As a bonus action, the orc can move up to its speed toward a hostile creature that it can see.
"""
[img[divider.png]]

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greataxe +5>>|<<slashing 1d12+3>> |<<reach 5>> |
| !<<ranged Javelin +5>>|<<piercing 1d6+3>> |<<reach 5>><br/><<range 30/120>> |
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8RiCIAEGJdMWfIJRTan1GP0Gq1qtxOs98oNiw/fMnSMpprXz7S7yI4n33Sf/K6s6294/P4/03cHSOgi6FeYeHLYp+g4woj4OMkR2UiJiWEpmdkZsXnpKdoAyjl6SlYqh8pqoGra2vk6GDs6u1orehuXq7u71uv5CxycOWxWbHz8lYy5zNw8+ewVLT0NVu14nZX9uN3Wrf0tFa44nldu/p0ufs3u7f7efiwPv1xv/4tvvbtP2e/v36uAyjYRFGbwoEBVCtUBbKjnGcQ62yaiOWcxzDn+chnVbOTYcclHcCHhjCRZMshJbimBrGTZksdLbDF1zKRZE8dNnDlp7MTSs8ZPoEEDDeVZtMVRpElVLCXalMVTplFLTKVaFdJVmFmtbj3TddFXlGFFjAVbVuvZOWnNrmXbFsRbuHE9zAVZt9LdvB/uouO7wS/gDoIHB95rWEPhxJoQM76w+HGFyJK7OK5seS7myZc3Q6Ds2QHo0AxGk1Zg+jSC1KpddW6d4DXs2G9nP1hrO7fu3bx7+/4NPLjw4cSLGz+OPLly4WyWGyLmfEXz6NKhU0cx/Tp269q9Iusu9jt472XGm8hu3q349FbWs+/LfaLf+fTLp6iPPz9e8vr++9e+71+AuAEoYIFXOWVggkshqGCDNzHoYIQjQShhhesQaGGG01CoYYcPhedhiLNwKGKJkZBoYoqwkBAfHehF5B5/UO3xIkUxsnjjGzW6mKN60Pyxo449tvcjjS0Kad92SRo55EVNwrckjE+KcaSP1AASpBtVEnklkFs6GaWMWKWRJZlTEnYmF2WCWeR5aW6x5hhfQtmmjW9qMaddd1YRJ5V7NhYmj39OkSeagSJ5qJaDWlComo3CuShniZoZqUiVZlanoJOy2SWInUq5qZyXSvAonqXyOep7qq7KaquuvgprrLLOSmuttt76w5hM0uUQWUpmiuinoAprZaq54mL+Z5+QCRIsL4qGouchnK5oqrTRMuLnidliq1dC1VqiESiHlQKpuN96uyy5qDK0rrnpstvELe2qy+iIhMp770D14svEh0boI6m9lvI7sMCY6luwwSYRTCrA/zq8sL+3DdMvxETQc7DCQmD8sMUTe6wSxQlrLJrIETM8BMefmHwxyy2DTIrLKcPskswfk7wxzcdK/BnPOaP8Ms4lA/2z0CETfTO9FRt9NLwBKz0yuks7/TS480o9NdYUIOyRu117/a6253JbrtXjkl022mNDezbbabu9NrLX0jKts5RS27ay8cIdLt108v014IHjXbW1bzPrqNZbU5214iebXTjYj0vrHjTXK+tsB+Y9qJy0z5nbvDPotEk08z2lmx5zPDVvWDTqC1wYOuuxuz56RZ/bfrvqq22Uu+428V477L8Dv8NHwY8jk/HFT5iK8jmclLzzAUA/vPR8MD/9StUTfz31Lz2vPfjeh9899eUbP5P45tugIq9GkS9U+/s58f35Kdpv/fvt48+9T/L/pb/1+U9+/MNIAUN0QOENcH/sS18CO/RA3wXwfg2sXwUZGD8LZhCDCxTgBE0UQdltUEUhJN0FSXhC7I2QgivMH/042EIDlpAeGkwh8tQnPRfaUITbwx2ufgjEIApxiEQs4nUKAAA7
<<list-icons "[tag[Organization]sort[]]" "0 organizations found.">>
''Prerequisite:'' 9th level

You can cast jump on yourself at will, without expending a spell slot or material components.

"""
''Limited Telepathy.'' The otyugh can magically transmit simple messages and images to any creature within <<range 120>> of it that can understand a language. This form of telepathy doesn’t allow the receiving creature to telepathically respond.
"""
[img[divider.png]]
''Multiattack.'' The otyugh makes three attacks: one with its bite and two with its tentacles.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 2d8+3>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Con 15>> against disease or become [[Poisoned]] until the disease is cured. Every <<time 24h>> that elapse, the target must repeat the saving throw, reducing its hit point maximum <<damage 1d10>> on a failure. The disease is cured on a success. The target dies if the disease reduces its hit point maximum to 0. This reduction to the target’s hit point maximum lasts until the disease is cured. |<|
| !<<melee Tentacle +6>>|<<bludgeoning 1d8+3>> + <<piercing 1d8>> |<<reach 10>> |
|~|If the target is Medium or smaller, it is [[Grappled]], <<save Escape 13>> and [{Restrained]] until the grapple ends. The otyugh has two tentacles, each of which can grapple one target. |<|
| !Tentacle Slam|The otyugh slams creatures [[Grappled]] by it into each other or a solid surface. Each creature must succeed on a <<save Con 14>> or take <<bludgeoning 2d6+3>> and be [[Stunned]] until the end of the otyugh’s next turn. On a successful save, the target takes <<halved>> and isn’t stunned. |<|
Starting at 14th level, you can increase the power of your simpler spells. When you cast a wizard spell of 1st through 5th level that deals damage, you can deal maximum damage with that spell.

The first time you do so, you suffer no adverse effect. If you use this feature again before you finish a long rest, you take 2d12 necrotic damage for each level of the spell, immediately after you cast it. Each time you use this feature again before finishing a long rest, the necrotic damage per spell level increases by 1d12. This damage ignores resistance and immunity.
"""
''Flyby.'' The owl doesn't provoke opportunity attacks when it flies out of an enemy's reach. 
''Keen Hearing and Sight.'' The owl has advantage on Wisdom (Perception) checks that rely on hearing or sight. 
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Talons +3>>|<<slashing 1>> |<<reach 5>> |
"""
''Keen Sight and Smell.'' The owlbear has advantage on Wisdom (Perception) checks that rely on sight or smell.
"""
[img[divider.png]]
''Multiattack.'' The bear makes two attacks, one with its beak and one with its claws.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Beak +7>>|<<piercing 1d10+5>> |<<reach 5>> |
| !<<melee Claw +7>>|<<slashing 2d8+5>> |<<reach 5>> |
<h2><$link to={{!!title}}><$transclude field="caption"><$view field="title" /></$transclude></$link></h2>

<$transclude field="text" mode="block"/>
<h3><$link to={{!!title}}><$transclude field="caption"><$view field="title" /></$transclude></$link></h3>

<$transclude field="text" mode="block"/>
At 3rd level, your otherworldly patron bestows a gift upon you for your loyal service. You gain one of the following features of your choice.

<<sections-vertical "[[Pact of the Blade]] [[Pact of the Chain]] [[Pact of the Tome]] [[Pact of the Talisman]]">>

Your arcane research and the magic bestowed on you by your patron have given you facility with spells. See Spells Rules for the general rules of spellcasting and the Spells Listing for the warlock spell list.

!!! Cantrips

You know two cantrips of your choice from the warlock spell list. You learn additional warlock cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Warlock table.

!!! Spell Slots

The Warlock table shows how many spell slots you have to cast your warlock spells of 1st through 5th level. The table also shows what the level of those slots is; all of your spell slots are the same level. To cast one of your warlock spells of 1st level or higher, you must expend a spell slot. You regain all expended spell slots when you finish a short or long rest.

For example, when you are 5th level, you have two 3rd-level spell slots. To cast the 1st-level spell witch bolt, you must spend one of those slots, and you cast it as a 3rd-level spell.

!!! Spells Known of 1st Level and Higher

At 1st level, you know two 1st-level spells of your choice from the warlock spell list.

The Spells Known column of the Warlock table shows when you learn more warlock spells of your choice of 1st level and higher. A spell you choose must be of a level no higher than what’s shown in the table’s Slot Level column for your level. When you reach 6th level, for example, you learn a new warlock spell, which can be 1st, 2nd, or 3rd level.

Additionally, when you gain a level in this class, you can choose one of the warlock spells you know and replace it with another spell from the warlock spell list, which also must be of a level for which you have spell slots.

!!! Spellcasting Ability

Charisma is your spellcasting ability for your warlock spells, so you use your Charisma whenever a spell refers to your spellcasting ability. In addition, you use your Charisma modifier when setting the saving throw DC for a warlock spell you cast and when making an attack roll with one.

"""
''Spell save DC ='' 8 + your proficiency bonus + your Charisma modifier

''Spell attack modifier ='' your proficiency bonus + your Charisma modifier
"""

!!! Spellcasting Focus
You can use an arcane focus (see the Adventuring Gear section) as a spellcasting focus for your warlock spells.
You can use your action to create a pact weapon in your empty hand. You can choose the form that this melee weapon takes each time you create it (see the Weapons section for weapon options). You are proficient with it while you wield it. This weapon counts as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.

Your pact weapon disappears if it is more than 5 feet away from you for 1 minute or more. It also disappears if you use this feature again, if you dismiss the weapon (no action required), or if you die.

You can transform one magic weapon into your pact weapon by performing a special ritual while you hold the weapon. You perform the ritual over the course of 1 hour, which can be done during a short rest. You can then dismiss the weapon, shunting it into an extradimensional space, and it appears whenever you create your pact weapon thereafter. You can’t affect an artifact or a sentient weapon in this way. The weapon ceases being your pact weapon if you die, if you perform the 1-hour ritual on a different weapon, or if you use a 1-hour ritual to break your bond to it. The weapon appears at your feet if it is in the extradimensional space when the bond breaks.
You learn the [[Find Familiar]] spell and can cast it as a ritual. The spell doesn’t count against your number of spells known.

When you cast the spell, you can choose one of the normal forms for your familiar or one of the following special forms: imp, pseudodragon, quasit, or sprite.

Additionally, when you take the Attack action, you can forgo one of your own attacks to allow your familiar to make one attack with its reaction.
Your patron gives you a grimoire called a Book of Shadows. When you gain this feature, choose three cantrips from any class’s spell list (the three needn’t be from the same list). While the book is on your person, you can cast those cantrips at will. They don’t count against your number of cantrips known. If they don’t appear on the warlock spell list, they are nonetheless warlock spells for you.

If you lose your Book of Shadows, you can perform a 1-hour ceremony to receive a replacement from your patron. This ceremony can be performed during a short or long rest, and it destroys the previous book. The book turns to ash when you die.
Proficiency with painter’s supplies represents your ability to paint and draw. You also acquire an understanding of art history, which can aid you in examining works of art.

''Components.'' Painter’s supplies include an easel, canvas, paints, brushes, charcoal sticks, and a palette.

''Arcana, History, Religion.'' Your expertise aids you in uncovering lore of any sort that is attached to a work of art, such as the magical properties of a painting or the origins of a strange mural found in a dungeon.

''Investigation, Perception.'' When you inspect a painting or a similar work of visual art, your knowledge of the practices behind creating it can grant you additional insight.

''Painting and Drawing.'' As part of a short or long rest, you can produce a simple work of art. Although your work might lack precision, you can capture an image or a scene, or make a quick copy of a piece of art you saw.

| !Activity | !DC |
|!Paint an accurate portrait | 10 |
|!Create a painting with a hidden message | 20 |
As a paladin, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d10 per paladin level
''Hit Points at 1st Level:'' 10 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d10 (or 6) + your Constitution modifier per paladin level after 1st
"""

!!! Proficiencies

"""
''Armor:'' All armor, shields
''Weapons:'' Simple weapons, martial weapons
''Tools:'' None
''Saving Throws:'' Wisdom, Charisma
''Skills:'' Choose two from Athletics, Insight, Intimidation, Medicine, Persuasion, and Religion
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a martial weapon and a shield or (b) two martial weapons
(a) five javelins or (b) any simple melee weapon
(a) a priest’s pack or (b) an explorer’s pack
Chain mail and a holy symbol
"""


!!! Subclasses

<<list-box "[tag[Paladin]tag[Subclass]sort[]]">>

!!! Advancement Table
{{||PaladinAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Divine Sense]] [[Lay on Hands]] [[Paladin Fighting Style]] [[Paladin Spellcasting]] [[Divine Smite]] [[Divine Health]] [[Sacred Oath]] [[Paladin Harness Divine Power]] [[Paladin Ability Score Improvement]] [[Paladin Martial Versatility]] [[Paladin Extra Attack]] [[Aura of Protection]] [[Aura of Courage]] [[Improved Divine Smite]] [[Cleansing Touch]] [[Aura Improvements]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Paladin Ability Score Improvement}}
{{Paladin Ability Score Improvement}}
{{Paladin Ability Score Improvement}}
{{Paladin Ability Score Improvement}}
| !Level | !Proficiency<br/>Bonus | !Features | !—Spell Slots per Spell Level— |<|<|<|<|
|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |[[Divine Sense]], [[Lay on Hands]] | — | — | — | — | — |
| !2nd | +2 |[[Fighting Style|Paladin Fighting Style]], [[Spellcasting|Paladin Spellcasting]], [[Divine Smite]] | 2 | — | — | — | — |
| !3rd | +2 |[[Divine Health]], [[Sacred Oath]], Sacred Oath Feature | 3 | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 3 | — | — | — | — |
| !5th | +3 |[[Extra Attack|Paladin Extra Attack]] | 4 | 2 | — | — | — |
| !6th | +3 |[[Aura of Protection]] | 4 | 2 | — | — | — |
| !7th | +3 |Sacred Oath Feature | 4 | 3 | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Paladin Ability Score Improvement]] |  4 | 3 | — | — | — |
| !9th | +4 | — | 4 | 3 | 2 | — | — |
| !10th | +4 |[[Aura of Courage]] | 4 | 3 | 2 | — | — |
| !11th | +4 |[[Improved Divine Smite]] | 4 | 3 | 3 | — | — |
| !12th | +4 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | — | — |
| !13th | +5 | — | 4 | 3 | 3 | 1 | — |
| !14th | +5 |[[Cleansing Touch]] | 4 | 3 | 3 | 1 | — |
| !15th | +5 |Sacred Oath Feature | 4 | 3 | 3 | 2 | — |
| !16th | +5 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | 2 | — |
| !17th | +6 | — | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |[[Aura Improvements]] | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |[[Ability Score Improvement|Paladin Ability Score Improvement]] | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |Sacred Oath Feature | 4 | 3 | 3 | 3 | 2 |
Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.
At 2nd level, you adopt a style of fighting as your specialty. Choose one of the following options. You can’t take a Fighting Style option more than once, even if you later get to choose again.

<$list filter="[tag[Fighting Style]tag[Paladin]sort[]]"><p>{{||Link}}''.'' <$transclude tiddler=<<currentTiddler>>/></p></$list>
"""
''Optional Class Feature''
"""

You can expend a use of your Channel Divinity to fuel your spells. As a bonus action, you touch your holy symbol, utter a prayer, and regain one expended spell slot, the level of which can be no higher than half your proficiency bonus (rounded up). The number of times you can use this feature is based on the level you’ve reached in this class: 3rd level, once; 7th level, twice; and 15th level, thrice. You regain all expended uses when you finish a long rest.
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can replace a fighting style you know with another fighting style available to paladins. This replacement represents a shift of focus in your martial practice.
By 2nd level, you have learned to draw on divine magic through meditation and prayer to cast spells as a cleric does. See Spells Rules for the general rules of spellcasting and the Spells Listing for the paladin spell list.

!! Preparing and Casting Spells

The Paladin table shows how many spell slots you have to cast your paladin spells. To cast one of your paladin spells of 1st level or higher, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

You prepare the list of paladin spells that are available for you to cast, choosing from the paladin spell list. When you do so, choose a number of paladin spells equal to your Charisma modifier + half your paladin level, rounded down (minimum of one spell). The spells must be of a level for which you have spell slots.

For example, if you are a 5th-level paladin, you have four 1st-level and two 2nd-level spell slots. With a Charisma of 14, your list of prepared spells can include four spells of 1st or 2nd level, in any combination. If you prepare the 1st-level spell cure wounds, you can cast it using a 1st-level or a 2nd-level slot. Casting the spell doesn’t remove it from your list of prepared spells.

You can change your list of prepared spells when you finish a long rest. Preparing a new list of paladin spells requires time spent in prayer and meditation: at least 1 minute per spell level for each spell on your list.

!! Spellcasting Ability

Charisma is your spellcasting ability for your paladin spells, since their power derives from the strength of your convictions. You use your Charisma whenever a spell refers to your spellcasting ability. In addition, you use your Charisma modifier when setting the saving throw DC for a paladin spell you cast and when making an attack roll with one.

"""
''Spell save DC ='' 8 + your proficiency bonus + your Charisma modifier
''Spell attack modifier ='' your proficiency bonus + your Charisma modifier
"""

!! Spellcasting Focus

You can use a holy symbol (see the Adventuring Gear section) as a spellcasting focus for your paladin spells.
<<htabs "[tag[Paladin Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9wuBOANO8FiI7l8LgsB6XBb/WPD3/CeXH2vx+ncvN7Ot+X3p8MWqGVIyJOIN6hYY3iYFfmIQ9noWAlziZmp2cLZ+SkTKYkYOrpSajqJmpqyqhf7qrLKijVLe2L7Z3ure+FLKAwc4vuLS1zMcezpdry80Yyc3BwdPP04TR29zX21fU0RXkku/uCtaX7esK6Yzt6e/ekefwCvXm+vP8x/jk/P3zWA+ebZC0AwoMF4CQtaO9iwnMBiE/stZFexV0b+WhtlPTyI8CNHkftIproojgzKUfO+9TKwUiExl7JgmmQJLeS/OzdlznL2ilFPhz+B4lSZU9dDRssuDdVmzdXIRE/f5SzVzWnSk1elHhW61QbNEku9+kSq7MZYElFzTaVU9cXaEW2xAuMVF5RRvTPdci2algZTSF39nuUZlpRZF3UNE4WbOIZdwsIiQ61smbFjudDydooVk+9iVY03W/RmmjSvGagDX249WbJrzbBHz6kdm3PmWrgHP4atODSK3rZvE5+LofWm48itMG9eobZu4kGZ0wYuunf149mxq9a+nTtv8bCsv6U+/Dl0B+qVtjeh3reI+O7f040v/wP++vb+QeDP7cF//D03338AMkPfXfvpZ2BqFgio4IIINujgBAZSdOGEFBb3RYYDJhgBHRvONk6DGJrYYRsjhrWXTSh+CCJ7g62Ylm0bZnUjA4DRCJppK3KEAI9CDsljkOoESWSSSsa43hN5LAlllNLZlM89Ul6J5Wr51QFWll5eaWWTYzz5ZZlLuihmE1qZyaaQaBIVUptyjhhni15gNWeeFNaZJhN6/jnkYYAOKuFrhB4ao1WILkqgoIw+2tGdkE6qnKOUXrqlR5huWiEanH6aKZeggvrVqJj+ZSql4aUK6XmsIgrjq4NGKCuhJ9Y666245jnQrrz26mubGAXLJkPEfpn+0hnHZmnliWgue6aLuvL53qnUEnigpf09m2uYdOrqYQK2LvBjU9+S+6c8OYILIbp6qrunufHqmC6967K7rbj12hsuvo3yO6eML8rbr77vwtsujgkr0C3DAyebqMH7OlxoSf+6OzHF5oHkLXoA//oxbhxjLDLCIJM85cghR8RtwCajpjKSg5Qc8sr5Xitwpd6CtLDEi0Usc7Yte2zxxRrbSPTKLyddNHkohzq0cFEvTTPHQHdcXMo5C10xzzdHfQvLPnP9NURGB90p2L8MVbbZGx+d9rV2yp1p224zjbXQAEfH9tsx560z3HHzWWLfeP/9NIl0cyithf4EjviDwon+TXHhoUUa+dir2Rw31GgbLnXmmiu+eOdhQz765qJT7aB3XzgO89a7rQ440qjrKIHWnPe5k+qsk86360vTnpzen2Mu+0bGE58i7MIXr7uMzF/3fPDRT28JeBkcjj1lVVt/fffehx8i9+IH973l5J8vm/aSu8/++Ov/jnz8ZDntPPz2t69/+fjvvxzz0S90ANyF33J3wAKywG6Cm58C73c2dDDwgQWKYPL6R0G2XG2AlMtggLomQRB6sAPzSlHPRsieED7sgnbjnddEdC4TrjBOKDxekRCopBqmLoYqDJQOG3ivHtLohxycoNpOSMTaFayICUyiDZe4uw06UYlS3GH+FadIxSYmToRY3KIFvajFLkYRg2NMnxhZ+D8hGvGMWXSgFc3IRjSSsYy3i6Mc3fjEOdqRjphD4h7vWEcmEvCPb4xd/tJISBkKEIjVS6Qi9cjIQDoSkINsYyUnWUjPWHJ2mBTk4EpXv06CUpNHJKUoM+m7RxrylO+Doyc9x8pXUmORsaTk8lDJuFqCEXiR5KUubQnLPPryl8CcZSOJechLjjKXyNwlM4/ZzGQOc5PR1JAyJVlNHF6zg9n0nylX2U3ofTOU4Xwj+FJZTmyM05Tp3N05b9lOVQaTivEkISd3WE97ThNs+dTnJ+/ZT3m+c24BveBAC+rPZ6IToa2cZ8tbGJpQguIMotL45ycpirJzYtSaxmTmRkkGvo9aM6QirahEPVrSyr0vpQjCBktbKrmXVtSlMtXANyRaU3EFI6c23SlPk+PTnwp1qEQtqlGPitSkKnWpTG2qU7NQAAA7
|max top|k
| !Level | !Proficiency<br/>Bonus | !Features | !—Spell Slots per Spell Level— |<|<|<|<|
|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |<<list-abilities 1>> | — | — | — | — | — |
| !2nd | +2 |<<list-abilities 2>> | 2 | — | — | — | — |
| !3rd | +2 |<<list-abilities 3>> | 3 | — | — | — | — |
| !4th | +2 |<<list-abilities 4>> | 3 | — | — | — | — |
| !5th | +3 |<<list-abilities 5>> | 4 | 2 | — | — | — |
| !6th | +3 |<<list-abilities 6>> | 4 | 2 | — | — | — |
| !7th | +3 |<<list-abilities 7>> | 4 | 3 | — | — | — |
| !8th | +3 |<<list-abilities 8>> |  4 | 3 | — | — | — |
| !9th | +4 | <<list-abilities 9>> | 4 | 3 | 2 | — | — |
| !10th | +4 |<<list-abilities 10>> | 4 | 3 | 2 | — | — |
| !11th | +4 |<<list-abilities 11>> | 4 | 3 | 3 | — | — |
| !12th | +4 |<<list-abilities 12>> | 4 | 3 | 3 | — | — |
| !13th | +5 |<<list-abilities 13>> | 4 | 3 | 3 | 1 | — |
| !14th | +5 |<<list-abilities 14>> | 4 | 3 | 3 | 1 | — |
| !15th | +5 |<<list-abilities 15>> | 4 | 3 | 3 | 2 | — |
| !16th | +5 |<<list-abilities 16>> | 4 | 3 | 3 | 2 | — |
| !17th | +6 |<<list-abilities 17>> | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |<<list-abilities 18>> | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |<<list-abilities 19>> | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |<<list-abilities 20>> | 4 | 3 | 3 | 3 | 2 |
"""
''Price per Dose:'' 250 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 16>> or take <<poison 1d6>> and become [[Poisoned]]. 
** The [[Poisoned]] creature must repeat the saving throw every <<time 24h>>, taking <<poison 1d6>> on a failed save. 
** Until this poison ends, the damage the poison deals can’t be healed by any means. 
** After seven successful saving throws, the effect ends and the creature can heal normally.
"""
''Keen Smell.'' The panther has advantage on Wisdom (Perception) checks that rely on smell.
''Pounce.'' If the panther moves at least 20 feet straight toward a creature and then hits it with a claw attack on the same turn, that target must succeed on a <<save Str 12>> or be knocked prone. If the target is [[Prone]], the panther can make one bite attack against it as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<melee Claw +4>>|<<slashing 1d4+2>> |<<reach 5>> |
* A paralyzed creature is [[Incapacitated]] (see the condition) and can't move or speak.
* The creature automatically fails Strength and Dexterity saving throws.
* Attack rolls against the creature have advantage.
* Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.
A veil of shadows and silence radiates from you, masking you and your companions from detection.
For the duration, each creature you choose within 30 feet of you (including you) has a +10 bonus to Dexterity (Stealth) checks and can’t be tracked except by magical means. A creature that receives this bonus leaves behind no tracks or other traces of its passage.
A passage appears at a point of your choice that you can see on a wooden, plaster, or stone surface (such as a wall, a ceiling, or a floor) within range, and lasts for the duration. You choose the opening’s dimensions: up to 5 feet wide, 8 feet tall, and 20 feet deep. The passage creates no instability in a structure surrounding it.

When the opening disappears, any creatures or objects still in the passage created by the spell are safely ejected to an unoccupied space nearest to the surface on which you cast the spell.
For some barbarians, rage is a means to an end—that end being violence. The Path of the Berserker is a path of untrammeled fury, slick with blood. As you enter the berserker’s rage, you thrill in the chaos of battle, heedless of your own health or well-being.

{{||BarbarianAdvancementTemplate}}
{{||ClassAbilityTemplate}}
You can spend 1 [[Ki]] point to take the Dodge action as a bonus action on your turn.
While this pearl is on your person, you can use an action to speak its command word and regain one expended spell slot. If the expended slot was of 4th level or higher, the new slot is 3rd level. Once you have used the pearl, it can’t be used again until the next dawn.
Starting at 14th level, when you make an ability check, you can expend one use of [[Bardic Inspiration]]. Roll a Bardic Inspiration die and add the number rolled to your ability check. You can choose to do so after you roll the die for the ability check, but before the DM tells you whether you succeed or fail.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +6>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5yg2ovB3Lz7D4biSErZiWblyrbuC4fpTGPxjef6ntT+X+EJh8TiAohEGpfMJikJVTqn1Coiik1at1xe9qvtisdPsBlITqsp5/ZvDY8b3PS3/C6u6334/nQPWOM3WBRoSEOYmHPImKL46NIoeQJZKTKJqWK5uZHpecEZ+vBJGiR6elVaioqq6soq6voKaykrSwtpa4ubqLvL6+erC9wnPEwcZ+yLvKa8zJzm/AzdJS1MzWV9jW2lvc3t5P0NziQ+Tk5kfo4upL7Ovug+Db8j/04PYz+PH6O/z//C3z+AKwQOJFjG4C2EkRT+YljC4TGICSWqohjR4kL+jDI0zuL4weNGkB1EfiTJweRFlCVVrmLZySUpmDFleqJpwuYnnBF07uQ5ymcmoEGFTiLqwCgmpA2UHmV6xGkjqFGlHqKqwCojrD20GuKayisgsAfEBiI7x+wetAHUrkXrVg/btnHdzK1rly3eNnf3munrN8tcuoGxDCZcOAzgxFIWM+Zz+HHjwZLtRK4s6DBizJQ0p+Xc2TNoFJ4/j7ZQuuxp1Kk3g26t+jRs069nr54dmzNu2pJ3537sOyzw4LwDExde+Phvv8qR423elTl052qnR49rPSv27NrNcmdQ/XtVq+Kbki9vXin6oj7XQxDqvqfM+GxM0q+p8X5Lifr+PTjs35E+AF4iz4AZiWMgC9okGJAxDN7w0IPx3CRhVxBKgoMGu4EyYR06sAabJvV80Y6IooW2hImFkHaiI+QgchmM2ECml2XITIZVFDcqRpVguPgI1V+sgNGjkKHwhRQdm3gI1Fu9OAnTV8FIydJUcmCI0lDRPAXSTNn8hNFIKZ7E0D0XToSQNWcqU6Y6BLoJ0GpY4iMnl/DUaeeLeOY54558UuPnUuAEqiWghApq6KF//qhoocA0SiExkEbK6KSIVmrpokdmSukpnILZyqedciIqqJuW6uiSqI5ayaqm5uIqq4rE+uqTtKY6662yFqPrrnj0WuuvwPqazLC48mr+7KXIJqspHMwSu+WzzUYr7ZzCVjvtGNgq6+y22Vbj7bdbhCtuFeSWS8W51jajrpXdtnvVu/BSqca8W8lr71js5nvWvvxCqe2//VIrMJMEF5zXwQgjScbCAIPrsJIKR0zixBQbZvHFUNSr8Rkcd0xkxiDbmMfIFTdsMpABp6yjyCy7iPLLPJYsM44Q10zyzThnFvPOPK/ss4xAB82iy0H7SzSKQydtA9JMg2j0zvg+bcrHVFdt9dVXXo111k9vrTXYVF/79R1hk030lEyrnfYgaxPSNtw+w4pzqzXXIjOpLMdicqgdw/I3LRdLujAzBXPDLzrw0hlumtJ2OSxNtDIS9WmNgdqm23R1GThfhSmJyU4BADs=
At 20th level, when you roll for initiative and have no ki points remaining, you regain 4 [[Ki]] points.
You are immune to contracting any disease while you wear this pendant. If you are already infected with a disease, the effects of the disease are suppressed you while you wear the pendant.
This delicate silver chain has a brilliant-cut black gem pendant. While you wear it, poisons have no effect on you. You are immune to the [[Poisoned]] condition and have immunity to <<poison poison>> damage.
While you wear this pendant, you stabilize whenever you are dying at the start of your turn. In addition, whenever you roll a Hit Die to regain hit points, double the number of hit points it restores.
Beginning at 15th level, your rage is so fierce that it ends early only if you fall unconscious or if you choose to end it.
<<htabs "[tag[Person]sort[order]]">>
* A petrified creature is transformed, along with any nonmagical object it is wearing or carrying, into a solid inanimate substance (usually stone). Its weight increases by a factor of ten, and it ceases aging.
* The creature is [[Incapacitated]] (see the condition), can't move or speak, and is unaware of its surroundings.
* Attack rolls against the creature have advantage.
* The creature automatically fails Strength and Dexterity saving throws.
* The creature has resistance to all damage.
* The creature is immune to poison and disease, although a poison or disease already in its system is suspended, not neutralized.
You tap into the nightmares of a creature you can see within range and create an illusory manifestation of its deepest fears, visible only to that creature.
The target must make a Wisdom saving throw. On a failed save, the target becomes frightened for the duration. At the end of each of the target’s turns before the spell ends, the target must succeed on a Wisdom saving throw or take 4d10 psychic damage. On a successful save, the spell ends.
A Large quasi-real, horselike creature appears on the ground in an unoccupied space of your choice within range. You decide the creature’s appearance, but it is equipped with a saddle, bit, and bridle. Any of the equipment created by the spell vanishes in a puff of smoke if it is carried more than 10 feet away from the steed.

For the duration, you or a creature you choose can ride the steed. The creature uses the statistics for a riding horse, except it has a speed of 100 feet and can travel 10 miles in an hour, or 13 miles at a fast pace. When the spell ends, the steed gradually fades, giving the rider 1 minute to dismount. The spell ends if you use an action to dismiss it or if the steed takes any damage.
"""
''Ethereal Jaunt.'' As a bonus action, the spider can magically shift from the Material Plane to the Ethereal Plane, or vice versa.
''Spider Climb.'' The spider can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Web Walker.'' The spider ignores movement restrictions caused by webbing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d10+2>> |<<reach 5>> |
|~|The target must make a <<save Con 11>>, taking <fail><<poison 4d8>></fail>, or <pass><<halved>></pass>. If the poison damage reduces the target to <<hp 0>>, the target is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and is [[Paralyzed]] while [[Poisoned]] in this way. |<|
The next time you see a creature within <<time 10m>> after drinking this philter, you become [[Charmed]] by that creature for <<time 1h>>. If the creature is of a species and gender you are normally attracted to, you regard it as your true love while you are charmed. This potion’s rose-hued, effervescent liquid contains one easy-to-miss bubble shaped like a heart.
You must be proficient with wind instruments to use these pipes. They have 3 charges. You can use an action to play them and expend 1 charge to create an eerie, spellbinding tune. Each creature within 30 feet of you that hears you play must succeed on a <<save Wis 15>> or become [[Frightened]] of you for <<time 1m>>. If you wish, all creatures in the area that aren’t hostile toward you automatically succeed on the saving throw. A creature that fails the saving throw can repeat it at the end of each of its turns, ending the effect on itself on a success. A creature that succeeds on its saving throw is immune to the effect of these pipes for <<time 24h>>. The pipes regain <<roll 1d3>> expended charges daily at dawn.
You must be proficient with wind instruments to use these pipes. While you are attuned to the pipes, ordinary <<mob Rat>> and <<mob "Giant Rat">> are indifferent toward you and will not attack you unless you threaten or harm them.

The pipes have 3 charges. If you play the pipes as an action, you can use a bonus action to expend 1 to 3 charges, calling forth one <<mob "Swarm of Rats">> (see the Monster Manual for statistics) with each expended charge, provided that enough rats are within half a mile of you to be called in this fashion (as determined by the DM). If there aren’t enough rats to form a swarm, the charge is wasted. Called swarms move toward the music by the shortest available route but aren’t under your control otherwise. The pipes regain <<roll 1d3>> expended charges daily at dawn.

Whenever a swarm of rats that isn’t under another creature’s control comes within 30 feet of you while you are playing the pipes, you can make a Charisma check contested by the swarm’s Wisdom check. If you lose the contest, the swarm behaves as it normally would and can’t be swayed by the pipes’ music for the next <<time 24h>>. If you win the contest, the swarm is swayed by the pipes’ music and becomes friendly to you and your companions for as long as you continue to play the pipes each round as an action. A friendly swarm obeys your commands. If you issue no commands to a friendly swarm, it defends itself but otherwise takes no actions. If a friendly swarm starts its turn and can’t hear the pipes’ music, your control over that swarm ends, and the swarm behaves as it normally would and can’t be swayed by the pipes’ music for the next <<time 24h>>.
"""
''Fear Aura.'' Any creature hostile to the pit fiend that starts its turn within <<range 20>> of the pit fiend must make a <<save Wis 21>>, unless the pit fiend is [[Incapacitated]]. On a failed save, the creature is [[Frightened]] until the start of its next turn. If a creature’s saving throw is successful, the creature is immune to the pit fiend’s Fear Aura for the next <<time 24h>>.
''Magic Resistance.'' The pit fiend has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The pit fiend’s weapon attacks are magical.
''Innate Spellcasting.'' The pit fiend’s spellcasting ability is Charisma, <<skillcheck "Spell DC" 21>>. The pit fiend can innately cast the following spells, requiring no material components:
''At will:'' [[Detect Magic]], [[Fireball]]
''3/day each:'' [[Hold Monster]], [[Wall of Fire]]
"""
<<divider>>
''Multiattack.'' The pit fiend makes four attacks: one with its bite, one with its claw, one with its mace, and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +14>>|<<piercing 4d6+8>> |<<reach 5>> |
|~|Target must succeed on a <<save Con 21>> or become [[Poisoned]]. While [[Poisoned]] in this way, the target can’t regain <<hp>>, and it takes <<poison 6d6>> at the start of each of its turns. The poisoned target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
| !<<melee Claw +14>>|<<slashing 2d8+8>> |<<reach 10>> |
| !<<melee Mace +14>>|<<bludgeoning 2d6+8>>+<<fire 6d6>> |<<reach 10>> |
| !<<melee Tail +14>>|<<bludgeoning 3d10+8>> |<<reach 10>> |
You beseech an otherworldly entity for aid.
The being must be known to you: a god, a primordial, a demon prince, or some other being of cosmic power. That entity sends a celestial, an elemental, or a fiend loyal to it to aid you, making the creature appear in an unoccupied space within range. If you know a specific creature’s name, you can speak that name when you cast this spell to request that creature, though you might get a different creature anyway (DM’s choice).

When the creature appears, it is under no compulsion to behave in any particular way. You can ask the creature to perform a service in exchange for payment, but it isn’t obliged to do so. The requested task could range from simple (fly us across the chasm, or help us fight a battle) to complex (spy on our enemies, or protect us during our foray into the dungeon). You must be able to communicate with the creature to bargain for its services.

Payment can take a variety of forms. A celestial might require a sizable donation of gold or magic items to an allied temple, while a fiend might demand a living sacrifice or a gift of treasure. Some creatures might exchange their service for a quest undertaken by you.

As a rule of thumb, a task that can be measured in minutes requires a payment worth 100 gp per minute. A task measured in hours requires 1,000 gp per hour. And a task m easured in days (up to 10 days) requires 10,000 gp per day. The DM can adjust these payments based on the circumstances under which you cast the spell. If the task is aligned with the creature’s ethos, the payment might be halved or even waived. Nonhazardous tasks typically require only half the suggested payment, while especially dangerous tasks might require a greater gift. Creatures rarely accept tasks that seem suicidal.

After the creature completes the task, or when the agreed-upon duration of service expires, the creature returns to its home plane after reporting back to you, if appropriate to the task and if possible. If you are unable to agree on a price for the creature’s service, the creature immediately returns to its home plane.

A creature enlisted to join your group counts as a member of it, receiving a full share of experience points awarded.
With this spell, you attempt to bind a celestial, an elemental, a fey, or a fiend to your service.
The creature must be within range for the entire casting of the spell. (Typically, the creature is first summoned into the center of an inverted magic circle in order to keep it trapped while this spell is cast.) At the completion of the casting, the target must make a Charisma saving throw. On a failed save, it is bound to serve you for the duration. If the creature w as summoned or created by another spell, that spell’s duration is extended to match the duration of this spell.

A bound creature must follow your instructions to the best of its ability. You might command the creature to accompany you on an adventure, to guard a location, or to deliver a message. The creature obeys the letter of your instructions, but if the creature is hostile to you, it strives to twist your words to achieve its own objectives. If the creature carries out your instructions completely before the spell ends, it travels to you to report this fact if you are on the same plane of existence. If you are on a different plane of existence, it returns to the place where you bound it and remains there until the spell ends.
You and up to eight willing creatures who link hands in a circle are transported to a different plane of existence. You can specify a target destination in general terms, such as the City of Brass on the Elemental Plane of Fire or the palace of Dispater on the second level of the Nine Hells, and you appear in or near that destination. If you are trying to reac the City of Brass, for example, you might arrive in its Street of Steel, before its Gate of Ashes, or looking at the city from across the Sea of Fire, at the DM’s discretion.

Alternatively, if you know the sigil sequence of a teleportation circle on another plane of existence, this spell can take you to that circle. If the teleportation circle is too small to hold all the creatures you transported, they appear in the closest unoccupied spaces next to the circle.

You can use this spell to banish an unwilling creature to another plane. Choose a creature within your reach and make a melee spell attack against it. On a hit, the creature must make a Charisma saving throw. If the creature fails the save, it is transported to a random location on the plane of existence you specify. A creature so transported must find its own way back to your current plane of existence.
"""
''Angelic Weapons.'' The planetar’s weapon attacks are magical. When the planetar hits with any weapon, the weapon deals an extra <<radiant 5d8>> (included in the attack).
''Divine Awareness.'' The planetar knows if it hears a lie.
''Innate Spellcasting.'' The planetar’s spellcasting ability is Charisma (spell save DC 20). The planetar can innately cast the following spells, requiring no material components:
//At will:// [[Detect Evil and Good]], [[Invisibility]] (self only)
//3/day each:// [[Blade Barrier]], [[Dispel Evil and Good]], [[Flame Strike]], Raise Dead]]
//1/day each:// [[Commune]], [[Control Weather]], [[Insect Plague]]
''Magic Resistance.'' The planetar has advantage on saving throws against spells and other magical effects.
"""
[img[divider.png]]
''Multiattack.'' The planetar makes two melee attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +12>>|<<slashing 4d6+7>> + <<radiant 5d8>> |<<reach 5>> |
| !Healing Touch|''4/Day''<br/>The planetar touches another creature. The target magically regains <<heal 6d8+3>> and is freed from any curse, disease, poison, blindness, or deafness. |<|
Plants in this context are vegetable creatures, not ordinary flora. Most of them are ambulatory, and some are carnivorous. The quintessential plants are the shambling mound and the treant. Fungal creatures such as the gas spore and the myconid also fall into this category.

<<list-box "[tag[Plant]sort[]]" "No plants found.">>
This spell channels vitality into plants within a specific area. There are two possible uses for the spell, granting either immediate or long-term benefits.

If you cast this spell using 1 action, choose a point within range. All normal plants in a 100-foot radius centered on that point become thick and overgrown. A creature moving through the area must spend 4 feet of movement for every 1 foot it moves.

You can exclude one or more areas of any size within the spell’s area from being affected.

If you cast this spell over 8 hours, you enrich the land. All plants in a half-mile radius centered on a point within range become enriched for 1 year. The plants yield twice the normal amount of food when harvested.
While you’re wearing this armor, you can speak its command word as an action to gain the effect of the [[Etherealness]] spell, which last for <<time 10m>> or until you remove the armor or use an action to speak the command word again. This property of the armor can’t be used again until the next dawn. 
<<vtabs "[tag[Player Tool]sort[]]">>
"""
''Hold Breath.'' The plesiosaurus can hold its breath for <<time 1h>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 3d6+4>> |<<reach 10>> |
Given their insidious and deadly nature, poisons are illegal in most societies but are a favorite tool among assassins, drow, and other evil creatures.

<<htabs "[tag[Poison Type]sort[]]">>
"""
''Mechanical Trap''
"""
When a creature steps on a hidden pressure plate, poison-tipped darts shoot from spring-loaded or pressurized tubes cleverly embedded in the surrounding walls. An area might include multiple pressure plates, each one rigged to its own set of darts.

The tiny holes in the walls are obscured by dust and cobwebs, or cleverly hidden amid bas-reliefs, murals, or frescoes that adorn the walls.

|max top|k
|!Detection #1 |<<perception 15>> to spot cleverly hidden holes in the walls. |
|!Detection #2 |<<investigation 15>> to deduce presence of pressure plate from variations in the mortar and stone used to create it, |
|!Trigger |20 or more pounds of weight is placed on the pressure plate. |
|!Effect |4 darts released. Each dart makes <<ranged Dart +8>> attack against random target within 10 feet from pressure plate. <br/>''On Hit:'' Target takes <<piercing 1d4>> and must succeed on a <<save Con 15>>, taking <fail><<poison 2d10>></fail>, or <pass><<halved>></pass> |
|!Countermeasure #1 |Wedge an iron spike or other object under the pressure plate. |
|!Countermeasure #2 |Stuffing the holes with cloth or wax, preventing darts from being launched. |
"""
''Mechanical Trap''
"""
A poisoned needle is hidden within a treasure chest’s lock, or in something else that a creature might open. 

|max top|k
|!Detection |<<investigation 20>> to deduce trap's presence from alterations made to accommodate the needle. |
|!Trigger |Opening the chest without the proper key. |
|!Effect |Needle extends 3 inches straight out from the lock, causing <<piercing 1>>+ <<poison 2d10>> and must succeed on a <<save Con 15>> or be [[Poisoned]] for <<time 1h>> |
|!Countermeasure |<<thievestools 15>> <fail>Triggers the trap.</fail> <pass>Disarms the trap.</pass> |
You extend your hand toward a creature you can see within range and project a puff of noxious gas from your palm. The creature must succeed on a Constitution saving throw or take 1d12 poison damage.
A poisoned creature has disadvantage on attack rolls and ability checks.
A poisoner's kit includes the vials, chemicals, and other equipment necessary for the creation of poisons. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to craft or use poisons.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d>> |<<reach 5>> |
|~|The target must make a <<save Con 10>>, taking <fail><<poison 2d4>></fail>, or <pass><<halved>></pass>. |<|
"""
''Keen Smell.'' The bear has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<fold "Cave Bear, Variant">>
<<divider>>
''Multiattack.'' The bear makes two attacks: one with its bite and one with its claws.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 1d8+5>> |<<reach 5>> |
| !<<melee Claws +7>>|<<slashing 2d6+5>> |<<reach 5>> |
A poltergeist is a different kind of specter — the confused, invisible spirit of an individual with no sense of how he or she died. A poltergeist expresses its rage by hurling creatures and objects using the power of its shattered psyche.

A poltergeist has a challenge rating of 2 (450 XP) and gains the following additional trait:

"""
''Invisibility.'' The poltergeist is invisible.
"""

The poltergeist has the following action options in place of the specter’s Life Drain:

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Forceful Slam" +4>>|<<force 3d6>> |<<reach 5>> |
| !Telekinetic Thrust|The poltergeist targets a creature or unattended object within 30 feet of it. A creature must be Medium or smaller to be affected by this magic, and an object can weigh up to 150 pounds.<br/>&nbsp;<br/>If the target is a creature, the poltergeist makes a Charisma check contested by the target’s Strength check. If the poltergeist wins the contest, the poltergeist hurls the target up to 30 feet in any direction, including upward. If the target then comes into contact with a hard surface or heavy object, the target takes <<damage "1d6 per 10' moved">>.<br/>&nbsp;<br/>If the target is an object that isn’t being worn or carried, the poltergeist hurls it up to 30 feet in any direction. The poltergeist can use the object as a ranged weapon, attacking one creature along the object’s path (+4 to hit) and dealing <<bludgeoning 2d4>> on a hit. |<|
This spell transforms a creature that you can see within range into a new form. An unwilling creature must make a Wisdom saving throw to avoid the effect. A shapechanger automatically succeeds on this saving throw.

The transformation lasts for the duration, or until the target drops to 0 hit points or dies. The new form can be any beast whose challenge rating is equal to or less than the target’s (or the target’s level, if it doesn’t have a challenge rating). The target’s game statistics, including mental ability scores, are replaced by the statistics of the chosen beast. It retains its alignment and personality.

The target assumes the hit points of its new form. When it reverts to its normal form, the creature returns to the number of hit points it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn’t reduce the creature’s normal form to 0 hit points, it isn’t knocked unconscious.

The creature is limited in the actions it can perform by the nature of its new form, and it can’t speak, cast spells, or take any other action that requires hands or speech.

The target’s gear melds into the new form. The creature can’t activate, use, wield, or otherwise benefit from any of its equipment. This spell can’t affect a target that has 0 hit points.

!!! Polymorph Guide

{{Polymorph Guide}}
!! Utility Forms
| !CR | !Creature | !Size | !Swim | !Fly | !Notes |
|^ !0 |![[Owl]] | Tiny | - | Yes | Flyby |
|^ !1 |![[Giant Eagle]] | Large | - | Yes | |
|~|![[Giant Octopus]] | Large | Yes | - | |

!!Combat Forms
| !CR | !Creature | !Swim | !Fly | !Notes |
|^ !1/8 |![[Flying Snake]] | - | Yes | |
|^ !3 |![[Ankylosaurus]] | - | - | |
|~|![[Giant Scorpion]] | - | - | |
|~|![[Killer Whale]] | Yes | - | |
|^ !4 |![[Elephant]] | - | - | |
|^ !5 |![[Brontosaurus]] | - | - | |
|~|![[Triceratops]] | - | - | |
|~|![[Giant Crocodile]] | - | - | |
|^ !6 |![[Mammoth]] | - | - | |
|^ !7 |![[Giant Ape]] | - | - | |
|^ !8 |![[Tyrannosaurus Rex]] | - | - | |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +4>>|<<bludgeoning 2d4+2>> |<<reach 5>> |
This fine black cloth, soft as silk, is folded up to the dimensions of a handkerchief. It unfolds into a circular sheet 6 feet in diameter.

You can use an action to unfold a portable hole and place it on or against a solid surface, whereupon the portable hole creates an extradimensional hole 10 feet deep. The cylindrical space within the hole exists on a different plane, so it can’t be used to create open passages. Any creature inside an open portable hole can exit the hole by climbing out of it.

You can use an action to close a portable hole by taking hold of the edges of the cloth and folding it up. Folding the cloth closes the hole, and any creatures or objects within remain in the extradimensional space. No matter what’s in it, the hole weighs next to nothing.

If the hole is folded up, a creature within the hole’s extradimensional space can use an action to make a <<skillcheck Str 10>>. On a successful check, the creature forces its way out and appears within 5 feet of the portable hole or the creature carrying it. A breathing creature within a closed portable hole can survive for up to <<time 10m>>, after which time it begins to suffocate.

Placing a portable hole inside an extradimensional space created by a [[Bag of Holding]], [[Heward's Handy Haversack]], or similar item instantly destroys both items and opens a gate to the Astral Plane. The gate originates where the one item was placed inside the other. Any creature within 10 feet of the gate is sucked through it and deposited in a random location on the Astral Plane. The gate then closes. The gate is one-way only and can’t be reopened.
Starting at 6th level, your damaging cantrips affect even creatures that avoid the brunt of the effect. When a creature succeeds on a saving throw against your cantrip, the creature takes half the cantrip’s damage (if any) but suffers no additional effect from the cantrip.
When you drink this potion, you gain resistance to <<acid acid>> damage for <<time 1h>>.
When you drink this potion, you can cast the [[Animal Friendship]] spell (<<save "Spell DC" 13>>) for <<time 1h>> at will. Agitating this muddy liquid brings little bits into view: a fish scale, a hummingbird tongue, a cat claw, or a squirrel hair.
When you drink this potion, you gain the effect of the [[Clairvoyance]] spell. An eyeball bobs in this yellowish liquid but vanishes when the potion is opened.
When you drink this potion, you gain a climbing speed equal to your walking speed for <<time 1h>>. During this time, you have advantage on Strength (Athletics) checks you make to climb. The potion is separated into brown, silver, and gray layers resembling bands of stone. Shaking the bottle fails to mix the colors.
When you drink this potion, your Strength score changes to 27 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a cloud giant.
When you drink this potion, you gain resistance to <<cold cold>> damage for <<time 1h>>.
When you drink this potion, you gain the “reduce” effect of the [[Enlarge/Reduce]] spell for <<roll 1d4>> hours (no concentration required). The red in the potion’s liquid continuously contracts to a tiny bead and then expands to color the clear liquid around it. Shaking the bottle fails to interrupt this process.
When you drink this potion, your Strength score changes to 25 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a fire giant.
When you drink this potion, you gain resistance to <<fire fire>> damage for <<time 1h>>.
When you drink this potion, you gain a flying speed equal to your walking speed for <<time 1h>> and can hover. If you’re in the air when the potion wears off, you fall unless you have some other means of staying aloft. This potion’s clear liquid floats at the top of its container and has cloudy white impurities drifting in it.
When you drink this potion, you gain resistance to <<force force>> damage for <<time 1h>>.
When you drink this potion, your Strength score changes to 23 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a frost giant.
When you drink this potion, you gain the effect of the [[Gaseous Form]] spell for <<time 1h>> (no concentration required) or until you end the effect as a bonus action. This potion’s container seems to hold fog that moves and pours like water.
When you drink this potion, your Strength score changes for <<time 1h>>. The type of giant determines the score (see the table below). The potion has no effect on you if your Strength is equal to or greater than that score.

This potion’s transparent liquid has floating in it a sliver of fingernail from a giant of the appropriate type. The [[Potion of Frost Giant Strength]] and the [[Potion of Stone Giant Strength]] have the same effect.

| !Type of Giant | !Strength | !Rarity |
|![[Potion of Hill Giant Strength]] | 21 |Uncommon |
|![[Potion of Frost Giant Strength]] | 23 |Rare |
|![[Potion of Stone Giant Strength]] | 23 |Rare |
|![[Potion of Fire Giant Strength]] | 25 |Rare |
|![[Potion of Cloud Giant Strength]] | 27 |Very rare |
|![[Potion of Storm Giant Strength]] | 29 |Legendary |
You regain <<heal 4d4+4>> when you drink this potion. The potion's red liquid glimmers when agitated.
When you drink this potion, you gain the "enlarge" effect of the [[Enlarge/Reduce]] spell for <<roll 1d4>> hours (no concentration required). The red in the potion's liquid continuously expands from a tiny bead to color the clear liquid around it and then contracts. Shaking the bottle fails to interrupt this process.
You regain <<heal 2d4+2>> when you drink this potion. The potion's red liquid glimmers when agitated.
For <<time 1h>> after drinking it, you gain 10 temporary hit points that last for <<time 1h>>. For the same duration, you are under the effect of the [[Bless]] spell (no concentration required). This blue potion bubbles and steams as if boiling.
When you drink this potion, your Strength score changes to 21 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a hill giant.
This potion’s container looks empty but feels as though it holds liquid. When you drink it, you become [[Invisible]] for <<time 1h>>. Anything you wear or carry is [[Invisible]] with you. The effect ends early if you attack or cast a spell.
When you drink this potion, you gain resistance to <<lightning lightning>> damage for <<time 1h>>.
When you drink this potion, you gain the effect of the [[Detect Thoughts]] spell (<<save "Spell DC" 13>>). The potion’s dense, purple liquid has an ovoid cloud of pink floating in it.
When you drink this potion, you gain resistance to <<necrotic nerotic>> damage for <<time 1h>>.
This concoction looks, smells, and tastes like a [[Potion of Healing]] or other beneficial potion. However, it is actually poison masked by illusion magic. An [[Identify]] spell reveals its true nature.

If you drink it, you take <<poison 3d6>>, and you must succeed on a <<save Con 13>> or be [[Poisoned]]. At the start of each of your turns while you are poisoned in this way, you take <<poison 3d6>>. At the end of each of your turns, you can repeat the saving throw. On a successful save, the poison damage you take on your subsequent turns decreases by <<roll 1d6>>. The poison ends when the damage decreases to 0.
When you drink this potion, you gain resistance to <<poison poison>> damage for <<time 1h>>.
When you drink this potion, you gain resistance to <<psychic psychic>> damage for <<time 1h>>.
When you drink this potion, you gain resistance to <<radiant radiant>> damage for <<time 1h>>.
When you drink this potion, you gain resistance to one type of damage for <<time 1h>>. The DM chooses the type determines it randomly from the options below.

| !d10 | !Damage Type |
| !1 | Acid |
| !2 | Cold |
| !3 | Fire |
| !4 | Force |
| !5 | Lightning |
| !6 | Necrotic |
| !7 | Poison |
| !8 | Psychic |
| !9 | Radiant |
| !10 | Thunder |
When you drink this potion, you gain the effect of the [[Haste]] spell for <<time 1m>> (no concentration required). The potion’s yellow fluid is streaked with black and swirls on its own.
When you drink this potion, your Strength score changes to 23 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a stone giant.
When you drink this potion, your Strength score changes to 29 for <<time 1h>>. The potion has no effect on you if your Strength is equal to or greater than that score.

This potion's transparent liquid has floating in it a sliver of fingernail from a storm giant.
You regain <<heal 8d4+8>> when you drink this potion. The potion's red liquid glimmers when agitated.
You regain <<heal 10d4+20>> when you drink this potion. The potion's red liquid glimmers when agitated.
When you drink this potion, you gain resistance to <<thunder thunder>> damage for <<time 1h>>.
You can breathe underwater for <<time 1h>> after drinking this potion. Its cloudy green fluid smells of the sea and has a jellyfish-like bubble floating in it.
Potter’s tools are used to create a variety of ceramic objects, most typically pots and similar vessels.

''Components.'' Potter’s tools include:

* potter’s needles
* ribs
* scrapers
* a knife
* calipers

''History.'' Your expertise aids you in identifying ceramic objects, including when they were created and their likely place or culture of origin.

''Investigation,'' Perception. You gain additional insight when inspecting ceramics, uncovering clues others would overlook by spotting minor irregularities.

''Reconstruction.'' By examining pottery shards, you can determine an object’s original, intact form and its likely purpose.

| !Activity | !DC |
|!Determine what a vessel once held | 10 |
|!Create a serviceable pot | 15 |
|!Find a weak point in a ceramic object | 20 |
You utter a word of power that can compel one creature you can see within range to die instantly. If the creature you chose has 100 hit points or fewer, it dies. Otherwise, the spell has no effect.
You speak a word of power that can overwhelm the mind of one creature you can see within range, leaving it dumbfounded. If the target has 150 hit points or fewer, it is [[Stunned]]. Otherwise, the spell has no effect. The stunned target must make a Constitution saving throw at the end of each of its turns. On a successful save, this stunning effect ends.
Up to six creatures of your choice that you can see within range each regain hit points equal to 2d8 + your spellcasting ability modifier. This spell has no effect on undead or constructs.
Starting at 2nd level, you can use your [[Channel Divinity]] to heal the badly injured.

As an action, you present your holy symbol and evoke healing energy that can restore a number of hit points equal to five times your cleric level. Choose any creatures within 30 feet of you, and divide those hit points among them. This feature can restore a creature to no more than half of its hit point maximum. You can’t use this feature on an undead or a construct.

This spell is a minor magical trick that novice spellcasters use for practice. You create one of the following magical effects within range:

* You create an instantaneous, harmless sensory effect, such as a shower of sparks, a puff of wind, faint musical notes, or an odd odor. 
* You instantaneously light or snuff out a candle, a torch, or a small campfire. 
* You instantaneously clean or soil an object no larger than 1 cubic foot. 
* You chill, warm, or flavor up to 1 cubic foot of nonliving material for 1 hour. 
* You make a color, a small mark, or a symbol appear on an object or a surface for 1 hour. 
* You create a nonmagical trinket or an illusory image that can fit in your hand and that lasts until the end of your next turn. 

If you cast this spell multiple times, you can have up to three of its non-instantaneous effects active at a time, and you can dismiss such an effect as an action.
"""
''Divine Eminence.'' As a bonus action, the priest can expend a spell slot to cause its melee weapon attacks to magically deal an extra <<radiant 3d6>> to a target on a hit. This benefit lasts until the end of the turn . If the priest expends a spell slot of 2nd level or higher, the extra damage increases by 1d6 for each level above 1st.
''Spellcasting.'' The priest is a 5th-level spellcaster. Its spellcasting ability is Wisdom (<<save "Spell DC" 13>>, <<casted "Spell Attack" +5>>). The priest has the following cleric spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrip (at-will):'' [[Light]], [[Sacred Flame]], [[Thaumaturgy]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st (4 slots):'' [[Cure Wounds]], [[Guiding Bolt]], [[Sanctuary]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd (3 slots):'' [[Lesser Restoration]], [[Spiritual Weapon]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd (2 slots):'' [[Dispel Magic]], [[Spirit Guardians]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Mace +2>>|<<bludgeoning 1d6>> |<<reach 5>> |
"""
''Price:'' 19 gp
1 Backpack
1 Blanket
10 Candles
1 Tinderbox
1 Alms Box
2 Blocks of Incense
1 Censer
1 Vestments
2 Days of Rations
1 Waterskin
"""
"""
''Replaces the [[Primeval Awareness]] feature''
"""

You can focus your awareness through the interconnections of nature: you learn additional spells when you reach certain levels in this class if you don’t already know them, as shown in the Primal Awareness Spells table. These spells don’t count against the number of ranger spells you know.

| !Level | !Spell |
| !3rd |[[Speak with Animals]] |
| !5th |[[Beast Sense]] |
| !9th |[[Speak with Plants]] |
| !13th |[[Locate Creature]] |
| !17th |[[Commune with Nature]] |

You can cast each of these spells once without expending a spell slot. Once you cast a spell in this way, you can’t do so again until you finish a long rest.
At 20th level, you embody the power of the wilds. Your Strength and Constitution scores increase by 4. Your maximum for those scores is now 24.
"""
''Optional Class Feature''
"""

When you reach 3rd level and again at 10th level, you gain proficiency in one skill of your choice from the list of skills available to barbarians at 1st level.
Rage burns in every barbarian’s heart, a furnace that drives him or her toward greatness. Different barbarians attribute their rage to different sources, however. For some, it is an internal reservoir where pain, grief, and anger are forged into a fury hard as steel. Others see it as a spiritual blessing, a gift of a totem animal.
Beginning at 3rd level, you can use your action and expend one ranger spell slot to focus your awareness on the region around you. For 1 minute per level of the spell slot you expend, you can sense whether the following types of creatures are present within 1 mile of you (or within up to 6 miles if you are in your favored terrain): aberrations, celestials, dragons, elementals, fey, fiends, and undead. This feature doesn’t reveal the creatures’ location or number.
Eight multicolored rays of light flash from your hand. Each ray is a different color and has a different power and purpose. Each creature in a 60-foot cone must make a Dexterity saving throw. For each target, roll a d8 to determine which color ray affects it.

1. Red. The target takes 10d6 fire damage on a failed save, or half as much damage on a successful one.

2. Orange. The target takes 10d6 acid damage on a failed save, or half as much damage on a successful one.

3. Yellow. The target takes 10d6 lightning damage on a failed save, or half as much damage on a successful one.

4. Green. The target takes 10d6 poison damage on a failed save, or half as much damage on a successful one.

5. Blue. The target takes 10d6 cold damage on a failed save, or half as much damage on a successful one.

6. Indigo. On a failed save, the target is Restrained. It must then make a Constitution saving throw at the end of each of its turns. If it successfully saves three times, the spell ends. If it fails its save three times, it permanently turns to stone and is subjected to the petrified condition. The successes and failures don’t need to be consecutive; keep track of both until the target collects three of a kind.

7. Violet. On a failed save, the target is blinded. It must then make a Wisdom saving throw at the start of your next turn. A successful save ends the blindness. If it fails that save, the creature is transported to another plane of existence of the DM’s choosing and is no longer blinded. (Typically, a creature that is on a plane that isn’t its home plane is banished home, while other creatures are usually cast into the Astral or Ethereal planes.)

8. Special. The target is struck by two rays. Roll twice more, rerolling any 8.
A shimmering, multicolored plane of light forms a vertical opaque wall, //up to 90 feet long, 30 feet high, and 1 inch thick//, centered on a point you can seewithin range. Alternatively, you can shape the wall into a sphere up to 30 feet in diameter centered on a point you choose within range. The wall remains in place for the duration. If you position the wall so that it passes through a space occupied by a creature, the spell fails, and your action and the spell slot are wasted.

The wall sheds bright light out to a range of 100 feet and dim light for an additional 100 feet. You and creatures you designate at the time you cast the spell can pass through and remain near the wall without harm. If another creature that can see the wall moves to within 20 feet of it or starts its turn there, the creature must succeed on a Constitution saving throw or become blinded for 1 minute.

The wall consists of seven layers, each with a different color. When a creature attempts to reach into or pass through the wall, it does so one layer at a time through all the wall’s layers. As it passes or reaches through each layer, the creature must make a Dexterity saving throw or be affected by that layer’s properties as described below.

The wall can be destroyed, also one layer at a time, in order from red to violet, by means specific to each layer. Once a layer is destroyed, it remains so for the duration of the spell. A rod of cancellation destroys a prismatic wall, but an antimagic field has no effect on it.

# ''Red.'' The creature takes 10d6 fire damage on a failed save, or half as much damage on a successful one. While this layer is in place, nonmagical ranged attacks can’t pass through the wall. The layer can be destroyed by dealing at least 25 cold damage to it.

# ''Orange.'' The creature takes 10d6 acid damage on a failed save, or half as much damage on a successful one. While this layer is in place, magical ranged attacks can’t pass through the wall. The layer is destroyed by a strong wind.

# ''Yellow.'' The creature takes 10d6 lightning damage on a failed save, or half as much damage on a successful one. This layer can be destroyed by dealing at least 60 force damage to it.

# ''Green.'' The creature takes 10d6 poison damage on a failed save, or half as much damage on a successful one. A passwall spell, or another spell of equal or greater level that can open a portal on a solid surface, destroys this layer.

# ''Blue.'' The creature takes 10d6 cold damage on a failed save, or half as much damage on a successful one. This layer can be destroyed by dealing at least 25 fire damage to it.

# ''Indigo.'' On a failed save, the creature is [[Restrained]]. It must then make a Constitution saving throw at the end of each of its turns. If it successfully saves three times, the spell ends. If it fails its save three times, it permanently turns to stone and is subjected to the petrified condition. The successes and failures don’t need to be consecutive; keep track of both until the creature collects three of a kind. While this layer is in place, spells can’t be cast through the wall. The layer is destroyed by bright light shed by a daylight spell or a similar spell of equal or higher level.

# ''Violet.'' On a failed save, the creature is blinded. It must then make a Wisdom saving throw at the start of your next turn. A successful save ends the blindness. If it fails that save, the creature is transported to another plane of the DM’s choosing and is no longer blinded. (Typically, a creature that is on a plane that isn’t its home plane is banished home, while other creatures are usually cast into the Astral or Ethereal planes.) This layer is destroyed by a dispel magic spell or similar spell of equal or higher level that can end spells and magical effects.
You make an area within range magically secure. The area is a cube that can be as small as 5 feet to as large as 100 feet on each side. The spell lasts for the duration or until you use an action to dismiss it.

When you cast the spell, you decide what sort of security the spell provides, choosing any or all of the following properties:

* Sound can't pass through the barrier at the edge of the warded area.
* The barrier of the warded area appears dark and foggy, preventing vision (including darkvision) through it.
* Sensors created by divination spells can't appear inside the protected area or pass through the barrier at its perimeter.
* Creatures in the area can't be targeted by divination spells.
* Nothing can teleport into or out of the warded area.
* Planar travel is blocked within the warded area.

Casting this spell on the same spot every day for a year makes this effect permanent.
A flickering flame appears in your hand.
The flame remains there for the duration and harms neither you nor your equipment. The flame sheds bright light in a 10-foot radius and dim light for an additional 10 feet. The spell ends if you dismiss it as an action or if you cast it again.

You can also attack with the flame, although doing so ends the spell. When you cast this spell, or as an action on a later turn, you can hurl the flame at a creature within 30 feet of you. Make a ranged spell attack. On a hit, the target takes 1d8 fire damage.
You create an illusion of an object, a creature, or some other visible phenomenon within range that activates when a specific condition occurs. The illusion is imperceptible until then. It must be no larger than a 30-foot cube, and you decide when you cast the spell how the illusion behaves and what sounds it makes. This scripted performance can last up to 5 minutes.

When the condition you specify occurs, the illusion springs into existence and performs in the manner you described. Once the illusion finishes performing, it disappears and remains dormant for 10 minutes. After this time, the illusion can be activated again.

The triggering condition can be as general or as detailed as you like, though it must be based on visual or audible conditions that occur within 30 feet of the area. For example, you could create an illusion of yourself to appear and warn off others who attempt to open a trapped door, or you could set the illusion to trigger only when a creature says the correct word or phrase.

Physical interaction with the image reveals it to be an illusion, because things can pass through it. A creature that uses its action to examine the image can determine that it is an illusion with a successful Intelligence (Investigation) check against your spell save DC. If a creature discerns the illusion for what it is, the creature can see through the image, and any noise it makes sounds hollow to the creature.
You create an illusory copy of yourself that lasts for the duration.
The copy can appear at any location within range that you have seen before, regardless of intervening obstacles. The illusion looks and sounds like you but is intangible. If the illusion takes any damage, it disappears, and the spell ends.

You can use your action to move this illusion up to twice your speed, and make it gesture, speak, and behave in whatever way you choose. It mimics your mannerisms perfectly.

You can see through its eyes and hear through its ears as if you were in its space. On your turn as a bonus action, you can switch from using its senses to using your own, or back again. While you are using its senses, you are blinded and deafened in regard to your own surroundings.

Physical interaction with the image reveals it to be an illusion, because things can pass through it. A creature that uses its action to examine the image can determine that it is an illusion with a successful Intelligence (Investigation) check against your spell save DC. If a creature discerns the illusion for what it is, the creature can see through the image, and any noise it makes sounds hollow to the creature.
* A prone creature's only movement option is to crawl, unless it stands up and thereby ends the condition.
* The creature has disadvantage on attack rolls.
* An attack roll against the creature has advantage if the attacker is within 5 feet of the creature. Otherwise, the attack roll has disadvantage.
When a creature you can see attacks a target other than you that is within 5 feet of you, you can use your reaction to impose disadvantage on the attack roll. You must be wielding a shield.
For the duration, the willing creature you touch has resistance to one damage type of your choice: acid, cold, fire, lightning, or thunder.
Until the spell ends, one willing creature you touch is protected against certain types of creatures: aberrations, celestials, elementals, fey, fiends, and undead.

The protection grants several benefits. Creatures of those types have disadvantage on attack rolls against the target. The target also can’t be [[Charmed]], [[Frightened]], or possessed by them. If the target is already [[Charmed]], [[Frightened]], or possessed by such a creature, the target has advantage on any new saving throw against the relevant effect.
You touch a creature. If it is poisoned, you neutralize the poison. If more than one poison afflicts the target, you neutralize one poison that you know is present, or you neutralize one at random.

For the duration, the target has advantage on saving throws against being poisoned, and it has resistance to poison damage.
"""
''Keen Senses.'' The pseudodragon has advantage on Wisdom (Perception) checks that rely on sight, hearing, or smell.
''Magic Resistance.'' The pseudodragon has advantage on saving throws against spells and other magical effects.
''Limited Telepathy.'' The pseudodragon can magically communicate simple ideas, emotions, and images telepathically with any creature within 100 feet of it that can understand a language.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1d4+2>> |<<reach 5>> |
| !<<melee Sting +4>> |<<piercing 1d4+2>> |<<reach 5>> |
|~|Target must succeed on a <<save Con 11>> or become [[Poisoned]] for <<time 1h>>. If the saving throw fails by 5 or more, the target falls [[Unconscious]] for the same duration, or until it takes damage or another creature uses an action to shake it awake. |<|
<<htabs "[tag[Publication]sort[order]]">>
All nonmagical food and drink within a 5-foot-radius sphere centered on a point of your choice within range is purified and rendered free of poison and disease.
At 10th level, your mastery of the ki flowing through you makes you immune to disease and poison.
Beginning at 15th level, you are always under the effects of a [[Protection from Evil and Good]] spell.
"""
''Tunneler.'' The worm can burrow through solid rock at half its burrow speed and leaves a <<circle 10>> diameter tunnel in its wake.
"""
<<divider>>
''Multiattack.'' The worm makes two attacks: one with its bite and one with its stinger.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +14>>|<<piercing 3d8+9>> |<<reach 10>> |
|~|If the target is a Large or smaller creature, it must succeed on a <<save Dex 19>> or be swallowed by the worm. A swallowed creature is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the worm, and it takes <<acid 6d6>> at the start of each of the worm’s turns.<br/>&nbsp<br/>If the worm takes <<damage 30>> or more on a single turn from a creature inside it, the worm must succeed on a <<save Con 21>> at the end of that turn or regurgitate all swallowed creatures, which fall [[Prone]] in a space within 10 feet of the worm. If the worm dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse by using 20 feet of movement, exiting prone. |<|
| !<<melee "Tail Stinger" +14>>|<<piercing 3d6+9>> |<<reach 10>> |
|~|The target must make a <<save Con 19>>, taking <fail><<poison 12d6>></fail>, or <pass><<halved>></pass>. |<|
"""
''Price per Dose:'' 2,000 gp
"""

This poison must be harvested from a dead or incapacitated purple worm. 

* A creature subjected to this poison must make a <<save Con 19>>
** <fail><<poison 12d6>></fail>
** <pass><<halved>></pass>
"""
''Shapechanger.'' The quasit can use its action to polymorph into a beast form that resembles a bat (speed 10 ft. fly 40 ft.), a centipede (40 ft., climb 40 ft.), or a toad (40 ft., swim 40 ft.), or back into its true form. Its statistics are the same in each form, except for the speed changes noted. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Magic Resistance.'' The quasit has advantage on saving throws against spells and other magical effects.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Claws (Bite in Beast Form)" +4>>|<<piercing 1d4+3>> |<<reach 5>> |
|~|Target must succeed on a <<save Con 10>> or take <<poison 2d4>> and become [[Poisoned]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
| !Scare|''1/Day''<br/>One creature of the quasit’s choice within <<range 20>> of it must succeed on a <<save Wis 10>> or be [[Frightened]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, with disadvantage if the quasit is within line of sight, ending the effect on itself on a success. |<|
| !Invisibility|The quasit magically turns invisible until it attacks or uses Scare, or until its concentration ends (as if concentrating on a spell). Any equipment the quasit wears or carries is invisible with it. |<|
"""
''Optional Class Feature''
"""

As an action, you can spend 2 ki points and roll a Martial Arts die. You regain a number of hit points equal to the number rolled plus your proficiency bonus.
"""
''Blood Frenzy.'' The quipper has advantage on melee attack rolls against any creature that doesn’t have all its hit points.
''Water Breathing.'' The quipper can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1>> |<<reach 5>> |
At 17th level, you gain the ability to set up lethal vibrations in someone’s body. When you hit a creature with an unarmed strike, you can spend 3 [[Ki]] points to start these imperceptible vibrations, which last for a number of days equal to your monk level. The vibrations are harmless unless you use your action to end them. To do so, you and the target must be on the same plane of existence. When you use this action, the creature must make a Constitution saving throw. If it fails, it is reduced to 0 hit points. If it succeeds, it takes 10d10 necrotic damage.

You can have only one creature under the effect of this feature at a time. You can choose to end the vibrations harmlessly without using an action.
<div class="shadow-box" style="column-width: 11em;"><$list filter="[tag[Race]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>
In battle, you fight with primal ferocity. On your turn, you can enter a rage as a bonus action.

While raging, you gain the following benefits if you aren’t wearing heavy armor:

You have advantage on Strength checks and Strength saving throws.
When you make a melee weapon attack using Strength, you gain a bonus to the damage roll that increases as you gain levels as a barbarian, as shown in the Rage Damage column of the Barbarian table.
You have resistance to bludgeoning, piercing, and slashing damage.
If you are able to cast spells, you can’t cast them or concentrate on them while raging.

Your rage lasts for 1 minute. It ends early if you are knocked unconscious or if your turn ends and you haven’t attacked a hostile creature since your last turn or taken damage since then. You can also end your rage on your turn as a bonus action.

Once you have raged the number of times shown for your barbarian level in the Rages column of the Barbarian table, you must finish a long rest before you can rage again.

You return a dead creature you touch to life, provided that it has been dead no longer than 10 days. If the creature’s soul is both willing and at liberty to rejoin the body, the creature returns to life with 1 hit point.

This spell also neutralizes any poison and cures nonmagical diseases that affected the creature at the time it died. This spell doesn’t, however, remove magical diseases, curses, or similar effects; if these aren’t first removed prior to casting the spell, they take effect when the creature returns to life. The spell can’t return an undead creature to life.

This spell closes all mortal wounds, but it doesn’t restore missing body parts. If the creature is lacking body parts or organs integral for its survival – its head, for instance – the spell automatically fails.

Coming back from the dead is an ordeal. The target takes a -4 penalty to all attack rolls, saving throws, and ability checks. Every time the target finishes a long rest, the penalty is reduced by 1 until it disappears.
"""
''Limited Magic Immunity.'' The rakshasa can’t be affected or detected by spells of 6th level or lower unless it wishes to be. It has advantage on saving throws against all other spells and magical effects.
''Innate Spellcasting.'' The rakshasa’s innate spellcasting ability is Charisma (<<save "Spell DC" 18>>, <<casted +10>>). The rakshasa can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Thoughts]], [[Disguise Self]], [[Mage Hand]], [[Minor Illusion]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Charm Person]], [[Detect Magic]], [[Invisibility]], [[Major Image]], [[Suggestion]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Dominate Person]], [[Fly]], [[Plane Shift]], [[True Seeing]]
"""
<<divider>>
''Multiattack.'' The rakshasa makes two claw attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +7>>|<<slashing 2d6+2>> |<<reach 5>> |
|~|The target is cursed if it is a creature. The magical curse takes effect whenever the target takes a short or long rest, filling the target’s thoughts with horrible images and dreams. The cursed target gains no benefit from finishing a short or long rest. The curse lasts until it is lifted by a [[Remove Curse]] spell or similar magic. |<|
When you make a ranged attack, you fire a bow or a crossbow, hurl a handaxe, or otherwise send projectiles to strike a foe at a distance. A monster might shoot spines from its tail. Many spells also involve making a ranged attack.

* You can make ranged attacks only against targets within a specified range.
* If a ranged attack, such as one made with a spell, has a single range, you can’t attack a target beyond this range.
* Some ranged attacks, such as those made with a longbow or a shortbow, have two ranges. 
** ''Normal Range.'' The smaller number is the normal range
** ''Long Range.'' The larger number is the long range. Your attack roll has disadvantage when your target is beyond normal range
** ''Beyond Long Range.'' You can’t attack a target beyond the long range.

* ''Ranged Attacks in Close Combat.'' Aiming a ranged attack is more difficult when a foe is next to you. 
** When you make a ranged attack with a weapon, a spell, or some other means, you have disadvantage on the attack roll if you are within 5 feet of a hostile creature who can see you and who isn’t incapacitated.
As a ranger, you gain the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d10 per ranger level
''Hit Points at 1st Level:'' 10 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d10 (or 6) + your Constitution modifier per ranger level after 1st
"""

!!! Proficiencies

"""
''Armor:'' Light armor, medium armor, shields
''Weapons:'' Simple weapons, martial weapons
''Tools:'' None
''Saving Throws:'' Strength, Dexterity
''Skills:'' Choose three from Animal Handling, Athletics, Insight, Investigation, Nature, Perception, Stealth, and Survival
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) scale mail or (b) leather armor
(a) two shortswords or (b) two simple melee weapons
(a) a dungeoneer’s pack or (b) an explorer’s pack
A longbow and a quiver of 20 arrows
"""

!!! Subclasses


<<list-box "[tag[Ranger]tag[Subclass]sort[]]">>

!!! Advancement Table
{{||RangerAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Favored Enemy]] [[Favored Foe]] [[Natural Explorer]] [[Deft Explorer]] [[Ranger Fighting Style]] [[Ranger Spellcasting]] [[Ranger Spellcasting Focus]] [[Primeval Awareness]] [[Primal Awareness]] [[Ranger Ability Score Improvement]] [[Ranger Martial Versatility]] [[Ranger Extra Attack]] [[Land’s Stride]] [[Hide in Plain Sight]] [[Nature's Veil]] [[Vanish]] [[Feral Senses]] [[Foe Slayer]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Ranger Ability Score Improvement}}
{{Ranger Ability Score Improvement}}
{{Ranger Ability Score Improvement}}
{{Ranger Ability Score Improvement}}
| !Level | !Proficiency Bonus | !Features | !Spells Known | !Spell Slots per Spell Level |<|<|<|<|
|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |[[Favored Enemy]], [[Natural Explorer]] | — | — | — | — | — | — |
| !2nd | +2 |[[Fighting Style|Ranger Fighting Style]], [[Spellcasting|Ranger Spellcasting]] | 2 | 2 | — | — | — | — |
| !3rd | +2 |Ranger Archetype, [[Primeval Awareness]] | 3 | 3 | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 3 | 3 | — | — | — | — |
| !5th | +3 |[[Extra Attack|Ranger Extra Attack]] | 4 | 4 | 2 | — | — | — |
| !6th | +3 |[[Favored Enemy]], [[Natural Explorer]] | 4 | 4 | 2 | — | — | — |
| !7th | +3 |Ranger Archetype Feature | 5 | 4 | 3 | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Ranger Ability Score Improvement]], [[Land’s Stride]] | 5 | 4 | 3 | — | — | — |
| !9th | +4 | — | 6 | 4 | 3 | 2 | — | — |
| !10th | +4 |[[Natural Explorer]], [[Hide in Plain Sight]] | 6 | 4 | 3 | 2 | — | — |
| !11th | +4 |Ranger Archetype Feature | 7 | 4 | 3 | 3 | — | — |
| !12th | +4 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 7 | 4 | 3 | 3 | — | — |
| !13th | +5 | — | 8 | 4 | 3 | 3 | 1 | — |
| !14th | +5 |[[Favored Enemy]], [[Vanish]] | 8 | 4 | 3 | 3 | 1 | — |
| !15th | +5 |Ranger Archetype Feature | 9 | 4 | 3 | 3 | 2 | — |
| !16th | +5 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 9 | 4 | 3 | 3 | 2 | — |
| !17th | +6 | — | 10 | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |[[Feral Senses]] | 10 | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |[[Ability Score Improvement|Ranger Ability Score Improvement]] | 11 | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |[[Foe Slayer]] | 11 | 4 | 3 | 3 | 3 | 2 |
At 3rd level, you choose an archetype that you strive to emulate: the Hunter that is detailed at the end of the class description or one from another source. Your choice grants you features at 3rd level and again at 7th, 11th, and 15th level.
Beginning at 5th level, you can attack twice, instead of once, whenever you take the Attack action on your turn.
At 2nd level, you adopt a particular style of fighting as your specialty. Choose one of the following options. 

You can’t take a Fighting Style option more than once, even if you later get to choose again.

<$list filter="[tag[Fighting Style]tag[Ranger]sort[]]"><p>{{||Link}}''.'' <$transclude tiddler=<<currentTiddler>>/></p></$list>
Starting at 8th level, moving through nonmagical difficult terrain costs you no extra movement. You can also pass through nonmagical plants without being slowed by them and without taking damage from them if they have thorns, spines, or a similar hazard.

In addition, you have advantage on saving throws against plants that are magically created or manipulated to impede movement, such those created by the entangle spell.
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can replace a fighting style you know with another fighting style available to rangers. This replacement represents a shift of focus in your martial practice.
By the time you reach 2nd level, you have learned to use the magical essence of nature to cast spells, much as a druid does. See Spells Rules for the general rules of spellcasting and the Spells Listing for the ranger spell list.

!!! Spell Slots
The Ranger table shows how many spell slots you have to cast your ranger spells of 1st level and higher. To cast one of these spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

For example, if you know the 1st-level spell animal friendship and have a 1st-level and a 2nd-level spell slot available, you can cast animal friendship using either slot.

!!! Spells Known of 1st Level and Higher
You know two 1st-level spells of your choice from the ranger spell list.

The Spells Known column of the Ranger table shows when you learn more ranger spells of your choice. Each of these spells must be of a level for which you have spell slots. For instance, when you reach 5th level in this class, you can learn one new spell of 1st or 2nd level.

Additionally, when you gain a level in this class, you can choose one of the ranger spells you know and replace it with another spell from the ranger spell list, which also must be of a level for which you have spell slots.

!!! Spellcasting Ability
Wisdom is your spellcasting ability for your ranger spells, since your magic draws on your attunement to nature. You use your Wisdom whenever a spell refers to your spellcasting ability. In addition, you use your Wisdom modifier when setting the saving throw DC for a ranger spell you cast and when making an attack roll with one.

''Spell save DC ='' 8 + your proficiency bonus + your Wisdom modifier

''Spell attack modifier ='' your proficiency bonus + your Wisdom modifier
"""
''Optional Class Feature''
"""

You can use a druidic focus as a spellcasting focus for your ranger spells. A druidic focus might be a sprig of mistletoe or holly, a wand or rod made of yew or another special wood, a staff drawn whole from a living tree, or an object incorporating feathers, fur, bones, and teeth from sacred animals.
<<htabs "[tag[Ranger Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yuNwn4ipnh8QhQNpPQ6hC7fU7DOe85qG7X4PMbtJxv4QfY4fc3KCF4qJeoOMHYGPgI6VA4eVFoaJlQqUmB2dnACRrxObopavpQmhqwyhqKOoqZ+Yowy3pbCxvbmau7MEvbGPzLQCzrW2x7rBksrOsMGq18ygzp/FyL3TxNfYCdDQfuvdytOE5uAB5uhp7e6j4Yn75+WP+uPm93j7/O3uUPXz59bQIKNLgP4Tt//7QwFAhPYbuHBymqYdgQF8b+ghYrdvSCMaPGjV9CikxlUkxKiBFJcjF50hRMgDNZwowJpibEmziN3GQ5cOUVnkCDhsRCtCjPnkGWFm0pVMpSptKcTrH6dKpUrEq5NplKFZnXJWCfGv35VatZqGjJll3LVmdOtWvB7iliN6xMu3Pf1s2LBDDcs0mJ5NWLUvCQw4j3Km56eDDhsTwYS/4WGQjjxokz+9h8GbPnHaBDTy6sYzPnkaNxqDYtunWN17BPo55Nu7bq1X1yw97NG8Pu2uVKywBOPLbl48iT26asAnhwaM1dSHeu3PiK69izL4/OvXvc7yek33Vufnrx4eK9k49jvr3793fSy1/P3k169dT+9vPef1818X3gX4D4VdcbgAbOp51wBS7IYIMV+HdegBRmQCF/HtkXyYMQCsihJx5+COKAiIxIYonhqXJhisa0SAmMLgIjowIZzhhjjRHSh6OKKz7HY48+5gdkkEIeWN2NR5LyoJJLnsidk09CSZuUU1KZmZVXYukXiltOyFeRfn3pIFZektmhTmeimaZLa7LZJj8KwkkgQnPSWSc6d+KZ5zF78llfKSECugYngxJaaBo/IprCooyWh+CjKEQq6aS+VWrpd5Jgqt9ovHDaZ5fJgOqBpuaQmmCY/KCaqpkSsRpnW0fBekmY451KK5dqypUrBLbe1muOhdEV7C6ojVn+7JAf3fpqsmJasyNBxRKrbLPBUluttLliayN0sHJLY1vTAitsVNuSW665rHqbrku0stvusqDCyyKvpKIror2Y4gumvo/Sq6u1jPIbq8CAElzwqpIinLC2fIobqLv7ShyxwvPKG+o23xpcKscDe0wHyISKHLLD/5pcMbQXawwey/eiLILFC8Mcs8yIktwprjfb3CjPdGLcsssH45yo0HBS/ALSW85KA9NLO+2Jr/0C3aO6vlZYTr5Uzwg1k1jH5kjXR4pdbzifGusz10qjffWmaNMMIdlvt+32i0RbuLbdZxMW9tYk5h3uqPP1nfaHcgcuuG0Bq6w2zjYXLuaSh2f+a4jfzO5tuOXRdgv55XVnTjLFgEdetebPIsk44kaD3vnp0X6Nuit/m+567XSvvuDolOMxeeyYy0e77b2/7qLucqwUVTa6owcy77Mm/8zyxI3+CPJOf+65ht5Q7zxJ0EcffGh+o3K9u3tLbxrgvpRvUeKk4114MuZ35H722lPHsTXzK5R69gbm7TL68U9n9oOfyYQ2wHngzn/A25oC46EwbaHvL2mzmNEuKK0JZsWBFlQZrgQWvq4YDGmY+5TSNAgUDt5tcbLzHewkQ7Xh1QpjIdxJ/lDoNWvVcEMLfNY/XujDt9VvMGFQYQx7aDXbwcVfLmyhupjIRB6O73tyiWL+FPshQ/YdS31JtOHytCiu3nVRinBz068sN0Ys0s6MomoeDn8xQTt5JnQ71IYGIeipHnKudduroTl8Q0AhBpKM/bvdHy41REEmkh5vzMce6QNEvfERjnWMF7JKtkLWTJKFl2yVHvtYSdVdypOfVEYjJemoMmVSLKt8pJZmuMnOtNKHJoJlLB1zy9fpiHBww18vRZmhQVqyhYysYzDTqEhi9keGqDxmKYEpzFcgs2zOjGYyF6nJXNLyTYb8JTeYec1jLuKU9gDnMINJSm9awpzn5CYnlVkMcjZRmRBTpTbXeU9o/o5yGSukKdXJpY7t05bwJMczQWLNeCYUodhc5kAcL1JQg2JPHhM1qDSdhdGManSjHO2oRz8KUiQUAAA7
|max top|k
| !Level | !Proficiency Bonus | !Features | !Spells Known | !Spell Slots per Spell Level |<|<|<|<|
|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th |
| !1st | +2 |<<list-abilities 1>> | — | — | — | — | — | — |
| !2nd | +2 |<<list-abilities 2>> | 2 | 2 | — | — | — | — |
| !3rd | +2 |<<list-abilities 3>> | 3 | 3 | — | — | — | — |
| !4th | +2 |<<list-abilities 4>> | 3 | 3 | — | — | — | — |
| !5th | +3 |<<list-abilities 5>> | 4 | 4 | 2 | — | — | — |
| !6th | +3 |<<list-abilities 6>> | 4 | 4 | 2 | — | — | — |
| !7th | +3 |<<list-abilities 7>> | 5 | 4 | 3 | — | — | — |
| !8th | +3 |<<list-abilities 8>> | 5 | 4 | 3 | — | — | — |
| !9th | +4 |<<list-abilities 9>> | 6 | 4 | 3 | 2 | — | — |
| !10th | +4 |<<list-abilities 10>> | 6 | 4 | 3 | 2 | — | — |
| !11th | +4 |<<list-abilities 11>> | 7 | 4 | 3 | 3 | — | — |
| !12th | +4 |<<list-abilities 12>> | 7 | 4 | 3 | 3 | — | — |
| !13th | +5 |<<list-abilities 13>> | 8 | 4 | 3 | 3 | 1 | — |
| !14th | +5 |<<list-abilities 14>> | 8 | 4 | 3 | 3 | 1 | — |
| !15th | +5 |<<list-abilities 15>> | 9 | 4 | 3 | 3 | 2 | — |
| !16th | +5 |<<list-abilities 16>> | 9 | 4 | 3 | 3 | 2 | — |
| !17th | +6 |<<list-abilities 17>> | 10 | 4 | 3 | 3 | 3 | 1 |
| !18th | +6 |<<list-abilities 18>> | 10 | 4 | 3 | 3 | 3 | 1 |
| !19th | +6 |<<list-abilities 19>> | 11 | 4 | 3 | 3 | 3 | 2 |
| !20th | +6 |<<list-abilities 20>> | 11 | 4 | 3 | 3 | 3 | 2 |
"""
''Keen Smell.'' The rat has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite 0>>|<<piercing 1>> |<<reach 5>> |
"""
''Mimicry.'' The raven can mimic simple sounds it has heard, such as a person whispering, a baby crying, or an animal chittering. A creature that hears the sounds can tell they are imitations with a successful <<insight 10>>.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +4>>|<<piercing 1>> |<<reach 5>> |
<<vtabs "[tag[Raw Data]sort[]]">>
A black beam of enervating energy springs from your finger toward a creature within range.
Make a ranged spell attack against the target. On a hit, the target deals only half damage with weapon attacks that use Strength until the spell ends.

At the end of each of the target’s turns, it can make a Constitution saving throw against the spell. On a success, the spell ends.
A frigid beam of blue-white light streaks toward a creature within range. Make a ranged spell attack against the target. On a hit, it takes 1d8 cold damage, and its speed is reduced by 10 feet until the start of your next turn.
Salutations!

Ever since I returned to playing Dungeons & Dragons a few years ago, I started organizing everything I knew about the game into a personal wiki that I could bring to my games, initially as a player and later as a game master. 

What you see in this wiki is represents 3 years of work and refinement in organizing the depth and breath of my collected D&D knowledge into a coherent and manageable package. I have designed the wiki to be used as a companion while I run adventures and campaigns. 

''About Tiddlywiki.'' This wiki is built upon an open source wiki (''See:'' https://tiddlywiki.com/). I originally select tiddlywiki because the entire wiki could be self-contained in a single html file. This meant I could store a copy in Dropbox, Google Drive, ~OneDrive or whatever cloud-based storage system and can still easily view it on any browser on my computer or mobile phone.

//''Note:'' For legal reasons, I have removed all copyrighted material from the wiki. Only materials found in Wizard's of the Coast's [[System Reference Document version 5.1|https://dnd.wizards.com/articles/features/systems-reference-document-srd]] has been retained.//

Sincerely,<br/>intrinsical.

<div style="text-align:center;">{{Download}}</div>

---
Starting at 2nd level, you can throw aside all concern for defense to attack with fierce desperation. When you make your first attack on your turn, you can decide to attack recklessly. Doing so gives you advantage on melee weapon attack rolls using Strength during this turn, but attack rolls against you have advantage until your next turn.

"""
''Pack Tactics.'' The shark has advantage on an attack roll against a creature if at least one of the shark's allies is within 5 feet of the creature an d the ally isn't incapacitated.
''Water Breathing.'' The shark can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<bludgeoning 1d8+2>> |<<reach 5>> |
You touch a creature and stimulate its natural healing ability.
The target regains 4d8 + 15 hit points. For the duration of the spell, the target regains 1 hit point at the start of each of its turns (10 hit points each minute).

The target’s severed body members (fingers, legs, tails, and so on), if any, are restored after 2 minutes. If you have the severed part and hold it to the stump, the spell instantaneously causes the limb to knit to the stump.
You touch a dead humanoid or a piece of a dead humanoid. Provided that the creature has been dead no longer than 10 days, the spell forms a new adult body for it and then calls the soul to enter that body. If the target’s soul isn’t free or willing to do so, the spell fails.

The magic fashions a new body for the creature to inhabit, which likely causes the creature’s race to change. The DM rolls a d 100 and consults the following table to determine what form the creature takes when restored to life, or the DM chooses a form.

| !d100 | !Race |
| !01-04 | Dragonborn |
| !05-13 | Dwarf, Hill |
| !14-21 | Dwarf, Mountain |
| !22-25 | Elf, Dark |
| !26-34 | Elf, High |
| !35-42 | Elf, Wood |
| !43-46 | Gnome, Forest |
| !47-52 | Gnome, Rock |
| !53-56 | Half-Elf |
| !57-60 | Half-Orc |
| !61-68 | Halfling, Lightfoot |
| !69-76 | Halfling, Stout |
| !77-96 | Human |
| !97-00 | Tiefling |

The reincarnated creature recalls its former life and experiences. It retains the capabilities it had in its original form, except it exchanges its original race for the new one and changes its racial traits accordingly.
When you are reduced to 0 hit points but not killed outright, you can drop to 1 hit point instead. You can’t use this feature again until you finish a long rest.
''Prerequisite:'' 7th level, hex spell or a warlock feature that curses

Your curse creates a temporary bond between you and your target. As a bonus action, you can magically teleport up to 30 feet to an unoccupied space you can see within 5 feet of the target cursed by your hex spell or by a warlock feature of yours, such as Hexblade’s Curse or Sign of Ill Omen. To teleport in this way, you must be able to see the cursed target.

Starting at 11th level, your rage can keep you fighting despite grievous wounds. If you drop to 0 hit points while you’re raging and don’t die outright, you can make a DC 10 Constitution saving throw. If you succeed, you drop to 1 hit point instead.

Each time you use this feature after the first, the DC increases by 5. When you finish a short or long rest, the DC resets to 10.
By 11th level, you have refined your chosen skills until they approach perfection. Whenever you make an ability check that lets you add your proficiency bonus, you can treat a d20 roll of 9 or lower as a 10.
Starting at 7th level, you can add half your proficiency bonus (round up) to any Strength, Dexterity, or Constitution check you make that doesn’t already use your proficiency bonus.

In addition, when you make a running long jump, the distance you can cover increases by a number of feet equal to your Strength modifier.
"""
''Heated Body.'' A creature that touches the remorhaz or hits it with a melee attack while within 5 feet of it takes <<fire 3d6>> damage.
"""
[img[divider.png]]

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +11>>|<<piercing 6d10+7>> + <<fire 3d6>> |<<reach 10>> |
|~|If the target is a creature, it is [[Grappled]] (escape DC 17). Until this grapple ends, the target is [[Restrained]], and the remorhaz can't bite another target. |<|
|^ !Swallow|The remorhaz makes one bite attack against a Medium or smaller creature it is grappling. If the attack hits, that creature takes the bite's damage and is swallowed, and the grapple ends. While swallowed, the creature is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the remorhaz, and it takes <<acid 6d6>> at the start of each of the remorhaz's turns.<br/> If the remorhaz takes 30 damage or more on a single turn from a creature inside it, the remorhaz must succeed on a <<save Con 15>> at the end of that turn or regurgitate all swallowed creatures, which fall [[Prone]] in a space within 10 feet of the remorhaz. If the remorhaz dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse using 15 feet of movement, exiting [[Prone]]. |<|
At your touch, all curses affecting one creature or object end. If the object is a cursed magic item, its curse remains, but the spell breaks its owner's attunement to the object so it can be removed or discarded.
''Prerequisite:'' Eldritch Blast Cantrip

When you hit a creature with eldritch blast, you can push the creature up to 10 feet away from you in a straight line.
A sphere of shimmering force encloses a creature or object of Large size or smaller within range. An unwilling creature must make a Dexterity saving throw. On a failed save, the creature is enclosed for the duration.

Nothing—not physical objects, energy, or other spell effects—can pass through the barrier, in or out, though a creature in the sphere can breathe there. The sphere is immune to all damage, and a creature or object inside can’t be damaged by attacks or effects originating from outside, nor can a creature inside the sphere damage anything outside it.

The sphere is weightless and just large enough to contain the creature or object inside. An enclosed creature can use its action to push against the sphere’s walls and thus roll the sphere at up to half the creature’s speed. Similarly, the globe can be picked up and moved by other creatures.

A [[Disintegrate]] spell targeting the globe destroys it without harming anything inside it.
You touch one willing creature. Once before the spell ends, the target can roll a d4 and add the number rolled to one saving throw of its choice. It can roll the die before or after the saving throw. The spell then ends.
This glass jar, 3 inches in diameter, contains <<roll 1d4+1>> doses of a thick mixture that smells faintly of aloe. The jar and its contents weigh 1/2 pound.

As an action, one dose of the ointment can be swallowed or applied to the skin. The creature that receives it regains <<heal 2d8+2>>, ceases to be [[Poisoned]], and is cured of any disease.
* A restrained creature's speed becomes 0, and it can't benefit from any bonus to its speed.
* Attack rolls against the creature have advantage, and the creature's attack rolls have disadvantage.
* The creature has disadvantage on Dexterity saving throws.
You touch a dead creature that has been dead for no more than a century, that didn’t die of old age, and that isn’t undead. If its soul is free and willing, the target returns to life with all its hit points.

This spell neutralizes any poisons and cures normal diseases afflicting the creature when it died. It doesn’t, however, remove magical diseases, curses, and the like; if such affects aren’t removed prior to casting the spell, they afflict the target on its return to life.

This spell closes all mortal wounds and restores any missing body parts.

Coming back from the dead is an ordeal. The target takes a -4 penalty to all attack rolls, saving throws, and ability checks. Every time the target finishes a long rest, the penalty is reduced by 1 until it disappears.

Casting this spell to restore life to a creature that has been dead for one year or longer taxes you greatly. Until you finish a long rest, you can’t cast spells again, and you have disadvantage on all attack rolls, ability checks, and saving throws.
Starting at 14th level, when you take damage from a creature that is within 5 feet of you, you can use your reaction to make a melee weapon attack against that creature.
This spell reverses gravity in a 50-foot-radius, 100-foot high cylinder centered on a point within range.
All creatures and objects that aren’t somehow anchored to the ground in the area fall upward and reach the top of the area when you cast this spell. A creature can make a Dexterity saving throw to grab onto a fixed object it can reach, thus avoiding the fall.

If some solid object (such as a ceiling) is encountered in this fall, falling objects and creatures strike it just as they would during a normal downward fall. If an object or creature reaches the top of the area without striking anything, it remains there, oscillating slightly, for the duration.

At the end of the duration, affected objects and creatures fall back down.
You touch a creature that has died within the last minute. That creature returns to life with 1 hit point. This spell can’t return to life a creature that has died of old age, nor can it restore any missing body parts.
<<htabs "[tag[Reward]sort[]]">>
"""
''Charge.'' If the rhinoceros moves at least <<range 20>> straight toward a target and then hits it with a gore attack on the same turn, the target takes an extra <<bludgeoning 2d8>>. If the target is a creature, it must succeed on a <<save Str 15>> or be knocked [[Prone]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Gore +7>>|<<bludgeoning 2d8+5>> |<<reach 5>> |
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +5>>|<<bludgeoning 2d4+3>> |<<reach 5>> |
You have resistance to <<acid acid>> damage while wearing this ring.
This ring is linked to the Elemental Plane of Air.

While wearing this ring, you have advantage on attack rolls against <<mob "Air Elemental">>, and they have disadvantage on attack rolls against you. In addition, you have access to properties based on the Elemental Plane of Air.

The ring has 5 charges. It regains <<roll 1d4+1>> expended charges daily at dawn. Spells cast from the ring have a <<save "Spell DC" 17>>.

You can expend 2 of the ring’s charges to cast [[Dominate Monster]] on an <<mob "Air Elemental">>. In addition, when you fall, you descend 60 feet per round and take no damage from falling. You can also speak and understand Auran.

If you help slay an <<mob "Air Elemental">> while attuned to the ring, you gain access to the following additional properties:

* You have resistance to <<lightning lightning>> damage.
* You have a flying speed equal to your walking speed and can hover.
* You can cast the following spells from the ring, expending the necessary number of charges: 
** [[Chain Lightning]] (3 charges)
** [[Gust of Wind]] (2 charges)
** [[Wind Wall]] (1 charge)
This ring has 3 charges, and it regains <<roll 1d3>> expended charges daily at dawn. While wearing the ring, you can use an action to expend 1 of its charges to cast one of the following spells:

* [[Animal Friendship]] (<<save "Spell DC" 13>>)
* [[Fear]] (<<save "Spell DC" 13>>), targeting only beasts that have an Intelligence of 3 or lower
* [[Speak with Animals]]
You have resistance to <<cold cold>> damage while wearing this ring.
While wearing this ring, you can speak its command word as an action to summon a particular <<mob Djinni>> from the Elemental Plane of Air. The <<mob Djinni>> appears in an unoccupied space you choose within 120 feet of you. It remains as long as you concentrate (as if concentrating on a spell), to a maximum of <<time 1h>>, or until it drops to <<hp 0>>. It then returns to its home plane.

While summoned, the <<mob Djinni>> is friendly to you and your companions. It obeys any commands you give it, no matter what language you use. If you fail to command it, the <<mob Djinni>> defends itself against attackers but takes no other actions.

After the <<mob Djinni>> departs, it can’t be summoned again for <<time 24h>>, and the ring becomes nonmagical if the <<mob Djinni>> dies.
This ring is linked to the Elemental Plane of Earth.

While wearing this ring, you have advantage on attack rolls against <<mob "Earth Elemental">>, and they have disadvantage on attack rolls against you. In addition, you have access to properties based on the Elemental Plane of Earth.

The ring has 5 charges. It regains <<roll 1d4+1>> expended charges daily at dawn. Spells cast from the ring have a <<save "Spell DC" 17>>.

You can expend 2 of the ring's charges to cast [[Dominate Monster]] on an <<mob "Earth Elemental">>. In addition, you can move in difficult terrain that is composed of rubble, rocks, or dirt as if it were normal terrain. You can also speak and understand Terran.

If you help slay an <<mob "Earth Elemental">> while attuned to the ring, you gain access to the following additional properties:

* You have resistance to <<acid acid>> damage.
* You can move through solid earth or rock as if those areas were difficult terrain. If you end your turn there, you are shunted out to the nearest unoccupied space you last occupied.
* You can cast the following spells from the ring, expending the necessary number of charges: 
** [[Stone Shape]] (2 charges)
** [[Stoneskin]] (3 charges)
** [[Wall of Stone]] (3 charges)
This ring is linked to one of the four Elemental Planes. The DM chooses or randomly determines the linked plane.

While wearing this ring, you have advantage on attack rolls against elementals from the linked plane, and they have disadvantage on attack rolls against you. In addition, you have access to properties based on the linked plane.

The ring has 5 charges. It regains <<roll 1d4+1>> expended charges daily at dawn. Spells cast from the ring have a <<save "Spell DC" 17>>.
This ring has 3 charges, and it regains <<roll 1d3>> expended charges daily at dawn. When you fail a Dexterity saving throw while wearing it, you can use your reaction to expend 1 of its charges to succeed on that saving throw instead.
When you fall while wearing this ring, you descend 60 feet per round and take no damage from falling.
This ring is linked to the Elemental Plane of Fire.

While wearing this ring, you have advantage on attack rolls against <<mob "Fire Elemental">>, and they have disadvantage on attack rolls against you. In addition, you have access to properties based on the Elemental Plane of Fire.

The ring has 5 charges. It regains <<roll 1d4+1>> expended charges daily at dawn. Spells cast from the ring have a <<save "Spell DC" 17>>.

You can expend 2 of the ring's charges to cast [[Dominate Monster]] on a <<mob "Fire Elemental">>. In addition, you have resistance to <<fire fire>> damage. You can also speak and understand Ignan.

If you help slay a <<mob "Fire Elemental">> while attuned to the ring, you gain access to the following additional properties:

* You are immune to <<fire fire>> damage.
* You can cast the following spells from the ring, expending the necessary number of charges: 
** [[Burning Hands]] (1 charge)
** [[Fireball]] (2 charges)
** [[Wall of Fire]] (3 charges)
You have resistance to <<fire fire>> damage while wearing this ring.
You have resistance to <<force force>> damage while wearing this ring.
While you wear this ring, <<difficult>> doesn’t cost you extra movement. In addition, magic can neither reduce your speed nor cause you to be [[Paralyzed]] or [[Restrained]].
While wearing this ring, you can turn [[Invisible]] as an action. Anything you are wearing or carrying is [[Invisible]] with you. You remain [[Invisible]] until the ring is removed, until you attack or cast a spell, or until you use a bonus action to become visible again.
While wearing this ring, you can cast the [[Jump]] spell from it as a bonus action at will, but can target only yourself when you do so.
You have resistance to <<lightning lightning>> damage while wearing this ring.
While wearing this ring, you are immune to magic that allows other creatures to read your thoughts, determine whether you are lying, know your alignment, or know your creature type. Creatures can telepathically communicate with you only if you allow it.

You can use an action to cause the ring to become [[Invisible]] until you use another action to make it visible, until you remove the ring, or until you die.

If you die while wearing the ring, your soul enters it, unless it already houses a soul. You can remain in the ring or depart for the afterlife. As long as your soul is in the ring, you can telepathically communicate with any creature wearing it. A wearer can’t prevent this telepathic communication.
You have resistance to <<necrotic necrotic>> damage while wearing this ring.
You have resistance to <<poison poison>> damage while wearing this ring.
You gain a +1 bonus to AC and saving throws while wearing this ring.
While wearing this ring, you regain <<heal 1d6>> every <<time 10m>>, provided that you have at least <<hp 1>>. If you lose a body part, the ring causes the missing part to regrow and return to full functionality after <<roll "1d6+1 days">> if you have at least <<hp 1>> the whole time.
You have resistance to one damage type while wearing this ring. The gem in the ring indicates the type, which the DM chooses or determines randomly. 

| !d10 | !Damage Type | !Gem |
| !1 |Acid |Pearl |
| !2 |Cold |Tourmaline |
| !3 |Fire |Garnet |
| !4 |Force |Sapphire |
| !5 |Lightning |Citrine |
| !6 |Necrotic |Jet |
| !7 |Poison |Amethyst |
| !8 |Psychic |Jade |
| !9 |Radiant |Topaz |
| !10 |Thunder |Spinel |
While wearing this ring in <<dim>> or <<darkness>>, you can cast [[Dancing Lights]] and [[Light]] from the ring at will. Casting either spell from the ring requires an action.

The ring has 6 charges for the following other properties. The ring regains <<roll 1d6>> expended charges daily at dawn.

''Faerie Fire.'' You can expend 1 charge as an action to cast [[Faerie Fire]] from the ring.

''Ball Lightning.'' You can expend 2 charges as an action to create one to four 3-foot-diameter spheres of lightning. The more spheres you create, the less powerful each sphere is individually.

Each sphere appears in an unoccupied space you can see within 120 feet of you. The spheres last as long as you concentrate (as if concentrating on a spell), up to <<time 1m>>. Each sphere sheds <<dim 30>>.

As a bonus action, you can move each sphere up to 30 feet, but no farther than 120 feet away from you. When a creature other than you comes within 5 feet of a sphere, the sphere discharges lightning at that creature and disappears. That creature must make a <<save Dex 15>>. On a failed save, the creature takes <<lightning lightning>> damage based on the number of spheres you created.

| !Spheres | !Lightning Damage |
| !4 | <<lightning 2d4>> |
| !3 | <<lightning 2d6>> |
| !2 | <<lightning 5d4>> |
| !1 | <<lightning 4d12>> |

''Shooting Stars.'' You can expend 1 to 3 charges as an action. For every charge you expend, you launch a glowing mote of light from the ring at a point you can see within 60 feet of you. Each creature within a <<cube 15>> originating from that point is showered in sparks and must make a <<save Dex 15>> <fail><<fire 5d4>></fail> <pass><<halved>></pass>.
This ring stores spells cast into it, holding them until the attuned wearer uses them. The ring can store up to 5 levels worth of spells at a time. When found, it contains <<roll 1d6-1>> levels of stored spells chosen by the DM.

Any creature can cast a spell of 1st through 5th level into the ring by touching the ring as the spell is cast. The spell has no effect, other than to be stored in the ring. If the ring can’t hold the spell, the spell is expended without effect. The level of the slot used to cast the spell determines how much space it uses.

While wearing this ring, you can cast any spell stored in it. The spell uses the slot level, spell save DC, spell attack bonus, and spellcasting ability of the original caster, but is otherwise treated as if you cast the spell. The spell cast from the ring is no longer stored in it, freeing up space.
While wearing this ring, you have advantage on saving throws against any spell that targets only you (not in an area of effect). In addition, if you roll a 20 for the save and the spell is 7th level or lower, the spell has no effect on you and instead targets the caster, using the slot level, spell save DC, attack bonus, and spellcasting ability of the caster.
You have a swimming speed of 40 feet while wearing this ring.
While wearing this ring, you can cast the [[Telekinesis]] spell at will, but you can target only objects that aren’t being worn or carried.
This ring has 3 charges, and it regains <<roll 1d3>> expended charges daily at dawn. While wearing the ring, you can use an action to expend 1 to 3 of its charges to attack one creature you can see within 60 feet of you. The ring produces a spectral ram’s head and makes its attack roll with a +7 bonus. On a hit, for each charge you spend, the target takes <<force 2d10>> and is pushed 5 feet away from you.

Alternatively, you can expend 1 to 3 of the ring’s charges as an action to try to break an object you can see within 60 feet of you that isn’t being worn or carried. The ring makes a Strength check with a +5 bonus for each charge you spend.
While wearing this ring, you can use an action to expend 1 of its 3 charges to cast the [[Wish]] spell from it. The ring becomes nonmagical when you use the last charge.
You have resistance to <<thunder thunder>> damage while wearing this ring.
While wearing this ring, you have resistance to <<cold cold>> damage. In addition, you and everything you wear and carry are unharmed by temperatures as low as −50 degrees Fahrenheit.
This ring is linked to the Elemental Plane of Water.

While wearing this ring, you have advantage on attack rolls against <<mob "Water Elemental">>, and they have disadvantage on attack rolls against you. In addition, you have access to properties based on the Elemental Plane of Water.

The ring has 5 charges. It regains <<roll 1d4+1>> expended charges daily at dawn. Spells cast from the ring have a <<save "Spell DC" 17>>.

You can expend 2 of the ring's charges to cast [[Dominate Monster]] on a <<mob "Water Elemental">>. In addition, you can stand on and walk across liquid surfaces as if they were solid ground. You can also speak and understand Aquan.

If you help slay a <<mob "Water Elemental">> while attuned to the ring, you gain access to the following additional properties:

* You can breathe underwater and have a swimming speed equal to your walking speed.
* You can cast the following spells from the ring, expending the necessary number of charges: 
** [[Create or Destroy Water]] (1 charge)
** [[Control Water]] (3 charges)
** [[Ice Storm]] (2 charges)
** [[Wall of Ice]] (3 charges)
While wearing this ring, you can stand on and move across any liquid surface as if it were solid ground.
While wearing this ring, you can use an action to speak its command word. When you do so, you can see into and through solid matter for <<time 1m>>. This vision has a radius of 30 feet. To you, solid objects within that radius appear transparent and don’t prevent light from passing through them. The vision can penetrate 1 foot of stone, 1 inch of common metal, or up to 3 feet of wood or dirt. Thicker substances block the vision, as does a thin sheet of lead.

Whenever you use the ring again before taking a long rest, you must succeed on a <<save Con 15>> or gain one level of [[Exhaustion]].
<table>
<tr><th>Spell</th><th>Casting Time</th></tr>
<$list filter="[tag[Spell]field:ritual[Yes]sort[title]]" emptyMessage="<tr><td>No spells found.</td></tr>">
  <tr>
    <th align="left"><$link to=<<currentTiddler>> ><<currentTiddler>></$link></th>
    <td align="left">{{!!casting_time}}</td>
  </tr>
</$list>
</table>
This robe is adorned with eyelike patterns. While you wear the robe, you gain the following benefits:

* The robe lets you see in all directions, and you have advantage on Wisdom (Perception) checks that rely on sight.
* You have darkvision out to a range of 120 feet.
* You can see [[Invisible]] creatures and objects, as well as see into the Ethereal Plane, out to a range of 120 feet.

The eyes on the robe can’t be closed or averted. Although you can close or avert your own eyes, you are never considered to be doing so while wearing this robe.

A [[Light]] spell cast on the robe or a [[Daylight]] spell cast within 5 feet of the robe causes you to be [[Blinded]] for <<time 1m>>. At the end of each of your turns, you can make a <<save Con 11>> for [[Light]] or <<save Con 15>> for [[Daylight]], ending the blindness on a success.
This robe has 3 charges, and it regains <<roll 1d3>> expended charges daily at dawn. While you wear it, you can use an action and expend 1 charge to cause the garment to display a shifting pattern of dazzling hues until the end of your next turn. During this time, the robe sheds <<bright 30>> and an additional <<dim 30>>. Creatures that can see you have disadvantage on attack rolls against you. In addition, any creature in the bright light that can see you when the robe’s power is activated must succeed on a <<save Wis 15>> or become [[Stunned]] until the effect ends.
This black or dark blue robe is embroidered with small white or silver stars. You gain a +1 bonus to saving throws while you wear it.

Six stars, located on the robe’s upper front portion, are particularly large. While wearing this robe, you can use an action to pull off one of the stars and use it to cast [[Magic Missile]] as a 5th-level spell. Daily at dusk, <<roll 1d6>> removed stars reappear on the robe.

While you wear the robe, you can use an action to enter the Astral Plane along with everything you are wearing and carrying. You remain there until you use an action to return to the plane you were on. You reappear in the last space you occupied, or if that space is occupied, the nearest unoccupied space.
This elegant garment is made from exquisite cloth of white, gray, or black and adorned with silvery runes. The robe’s color corresponds to the alignment for which the item was created. A white robe was made for good, gray for neutral, and black for evil. You can’t attune to a robe of the archmagi that doesn’t correspond to your alignment.

You gain these benefits while wearing the robe:

* If you aren’t wearing armor, your base Armor Class is 15 + your Dexterity modifier.
* You have advantage on saving throws against spells and other magical effects.
* Your spell save DC and spell attack bonus each increase by 2.
This robe has cloth patches of various shapes and colors covering it. While wearing the robe, you can use an action to detach one of the patches, causing it to become the object or creature it represents. Once the last patch is removed, the robe becomes an ordinary garment.

The robe has two of each of the following patches:

* Dagger
* Bullseye lantern (filled and lit)
* Steel mirror
* 10-foot pole
* Hempen rope (50 feet, coiled)
* Sack

In addition, the robe has <<roll 4d4>> other patches. The DM chooses the patches or determines them randomly.

|top|k
| !d100 | !Patch |
| !01-08 |Bag of 100 gp |
| !09-15 |Silver coffer (1 foot long, 6 inches wide and deep) worth 500 gp |
| !16-22 |Iron door (up to 10 feet wide and 10 feet high, barred on one side of your choice), which you can place in an opening you can reach; it conforms to fit the opening, attaching and hinging itself |
| !23-30 |10 gems worth 100 gp each |
| !31-44 |Wooden ladder (24 feet long) |
| !45-51 |A <<mob "Riding Horse">> with saddle bags (see the Monster Manual for statistics) |
| !52-59 |Pit (a cube 10 feet on a side), which you can place on the ground within 10 feet of you |
| !60-68 |4 [[Potion of Healing]] |
| !69-75 |Rowboat (12 feet long) |
| !76-83 |[[Spell Scroll]] containing one spell of 1st to 3rd level |
| !84-90 |2 <<mob Mastiff>> (see the Monster Manual for statistics) |
| !91-96 |Window (2 feet by 4 feet, up to 2 feet deep), which you can place on a vertical surface you can reach |
| !97 -00 |Portable ram |
"""
''Keen Sight.'' The roc has advantage on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The roc makes two attacks: one with its beak and one with its talons.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +13>>|<<piercing 4d8+9>> |<<reach 10>> |
| !<<melee Talons +13>>|<<slashing 4d6+9>> |<<reach 5>> |
|~|The target is [[Grappled]] (<<save Escape 19>>). Until this grapple ends, the target is [[Restrained]], and the roc can’t use its talons on another target. |<|
As a rock gnome, you have a natural inventiveness and hardiness beyond that of other gnomes. Most gnomes in the worlds of D&D are rock gnomes, including the tinker gnomes of the Dragonlance setting.

|^!Ability Score Increase |^Your Constitution score increases by 1. |
|^![[Artificer’s Lore]] |^{{Artificer’s Lore}} |
|^![[Tinker]] |^<$transclude tiddler=Tinker mode=block /> |
While holding this rod, you can use your reaction to absorb a spell that is targeting only you and not with an area of effect. The absorbed spell’s effect is canceled, and the spell’s energy—not the spell itself—is stored in the rod. The energy has the same level as the spell when it was cast. The rod can absorb and store up to 50 levels of energy over the course of its existence. Once the rod absorbs 50 levels of energy, it can’t absorb more. If you are targeted by a spell that the rod can’t store, the rod has no effect on that spell.

When you become attuned to the rod, you know how many levels of energy the rod has absorbed over the course of its existence, and how many levels of spell energy it currently has stored.

If you are a spellcaster holding the rod, you can convert energy stored in it into spell slots to cast spells you have prepared or know. You can create spell slots only of a level equal to or lower than your own spell slots, up to a maximum of 5th level. You use the stored levels in place of your slots, but otherwise cast the spell as normal. For example, you can use 3 levels stored in the rod as a 3rd-level spell slot.

A newly found rod has <<roll 1d10>> levels of spell energy stored in it already. A rod that can no longer absorb spell energy and has no energy remaining becomes nonmagical.
This rod has a flanged head and the following properties.

''Alertness.'' While holding the rod, you have advantage on Wisdom (Perception) checks and on rolls for initiative.

''Spells.'' While holding the rod, you can use an action to cast one of the following spells from it: [[Detect Evil and Good]], [[Detect Magic]], [[Detect Poison and Disease]], or [[See Invisibility]].

''Protective Aura.'' As an action, you can plant the haft end of the rod in the ground, whereupon the rod's head sheds <<bright 60>> and an additional <<dim 60>>. While in that bright light, you and any creature that is friendly to you gain a +1 bonus to AC and saving throws and can sense the location of any invisible hostile creature that is also in the bright light.

The rod's head stops glowing and the effect ends after 10 minutes, or when a creature uses an action to pull the rod from the ground. This property can't be used again until the next dawn.
This rod has a flanged head, and it functions as a magic mace that grants a +3 bonus to attack and damage rolls made with it. The rod has properties associated with six different buttons that are set in a row along the haft. It has three other properties as well, detailed below.

''Six Buttons.'' You can press one of the rod’s six buttons as a bonus action. A button’s effect lasts until you push a different button or until you push the same button again, which causes the rod to revert to its normal form.

If you press ''button 1'', the rod becomes a [[Flame Tongue]], as a fiery blade sprouts from the end opposite the rod’s flanged head (you choose the type of sword).

If you press ''button 2'', the rod’s flanged head folds down and two crescent-shaped blades spring out, transforming the rod into a magic battleaxe that grants a +3 bonus to attack and damage rolls made with it.

If you press ''button 3'', the rod’s flanged head folds down, a spear point springs from the rod’s tip, and the rod’s handle lengthens into a 6-foot haft, transforming the rod into a magic spear that grants a +3 bonus to attack and damage rolls made with it.

If you press ''button 4'', the rod transforms into a climbing pole up to 50 feet long, as you specify. In surfaces as hard as granite, a spike at the bottom and three hooks at the top anchor the pole. Horizontal bars 3 inches long fold out from the sides, 1 foot apart, forming a ladder. The pole can bear up to 4,000 pounds. More weight or lack of solid anchoring causes the rod to revert to its normal form.

If you press ''button 5'', the rod transforms into a handheld battering ram and grants its user a +10 bonus to Strength checks made to break through doors, barricades, and other barriers.

If you press ''button 6'', the rod assumes or remains in its normal form and indicates magnetic north. (Nothing happens if this function of the rod is used in a location that has no magnetic north.) The rod also gives you knowledge of your approximate depth beneath the ground or your height above it.

''Drain Life.'' When you hit a creature with a melee attack using the rod, you can force the target to make a <<save Con 17>>. On a failure, the target takes an extra <<necrotic 4d6>>, and you regain a number of hit points equal to half that necrotic damage. This property can’t be used again until the next dawn.

''Paralyze.'' When you hit a creature with a melee attack using the rod, you can force the target to make a <<save Str 17>>. On a failure, the target is [[Paralyzed]] for <<time 1m>>. The target can repeat the saving throw at the end of each of its turns, ending the effect on a success. This property can’t be used again until the next dawn.

''Terrify.'' While holding the rod, you can use an action to force each creature you can see within 30 feet of you to make a <<save Wis 17>>. On a failure, a target is [[Frightened]] of you for <<time 1m>>. A [[Frightened]] target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. This property can’t be used again until the next dawn.
You can use an action to present the rod and command obedience from each creature of your choice that you can see within 120 feet of you. Each target must succeed on a <<save Wis 15>> or be [[Charmed]] by you for <<time 8h>>. While [[Charmed]] in this way, the creature regards you as its trusted leader. If harmed by you or your companions, or commanded to do something contrary to its nature, a target ceases to be charmed in this way. The rod can’t be used again until the next dawn.
While holding this rod, you can use an action to activate it. The rod then instantly transports you and up to 199 other willing creatures you can see to a paradise that exists in an extraplanar space. You choose the form that the paradise takes. It could be a tranquil garden, lovely glade, cheery tavern, immense palace, tropical island, fantastic carnival, or whatever else you can imagine. Regardless of its nature, the paradise contains enough water and food to sustain its visitors. Everything else that can be interacted with inside the extraplanar space can exist only there. For example, a flower picked from a garden in the paradise disappears if it is taken outside the extraplanar space.

For each hour spent in the paradise, a visitor regains hit points as if it had spent 1 Hit Die. Also, creatures don’t age while in the paradise, although time passes normally. Visitors can remain in the paradise for up to <<time 200d>> divided by the number of creatures present (round down).

When the time runs out or you use an action to end it, all visitors reappear in the location they occupied when you activated the rod, or an unoccupied space nearest that location. The rod can’t be used again until <<time 10d>> have passed.
As a rogue, you have the following class features.

!!! Hit Points

"""
''Hit Dice:'' 1d8 per rogue level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per rogue level after 1st
"""

!!! Proficiencies

"""
''Armor:'' Light armor
''Weapons:'' Simple weapons, hand crossbows, longswords, rapiers, shortswords
''Tools:'' Thieves’ tools
''Saving Throws:'' Dexterity, Intelligence
''Skills:'' Choose four from Acrobatics, Athletics, Deception, Insight, Intimidation, Investigation, Perception, Performance, Persuasion, Sleight of Hand, and Stealth
"""

!!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a rapier or (b) a shortsword
(a) a shortbow and quiver of 20 arrows or (b) a shortsword
(a) a burglar’s pack, (b) a dungeoneer’s pack, or (c) an explorer’s pack
Leather armor, two daggers, and thieves’ tools
"""

!!! Subclasses

<<list-box "[tag[Rogue]tag[Subclass]sort[]]">>

!!! Advancement Table

{{||RogueAdvancementTemplate}}
{{||ClassAbilityTemplate}}
<<sections-vertical "[[Rogue Expertise]] [[Sneak Attack]] [[Thieves’ Cant]] [[Cunning Action]] [[Roguish Archetype]] [[Steady Aim]] [[Rogue Ability Score Improvement]] [[Rogue Uncanny Dodge]] [[Rogue Evasion]] [[Reliable Talent]] [[Blindsense]] [[Slippery Mind]] [[Elusive]] [[Stroke of Luck]]">>
When you reach 4th level, and again at 8th, 10th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
{{Rogue Ability Score Improvement}}
{{Rogue Ability Score Improvement}}
{{Rogue Ability Score Improvement}}
{{Rogue Ability Score Improvement}}
{{Rogue Ability Score Improvement}}
| !Level | !Proficiency Bonus | !Sneak Attack | !Features |
| 1st | +2 | 1d6 |[[Expertise|Rogue Expertise]], [[Sneak Attack]], [[Thieves’ Cant]] |
| 2nd | +2 | 1d6 |[[Cunning Action]] |
| 3rd | +2 | 2d6 |[[Roguish Archetype]], [[Steady Aim]] |
| 4th | +2 | 2d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 5th | +3 | 3d6 |[[Uncanny Dodge|Rogue Uncanny Dodge]] |
| 6th | +3 | 3d6 |[[Expertise|Rogue Expertise]] |
| 7th | +3 | 4d6 |[[Evasion|Rogue Evasion]] |
| 8th | +3 | 4d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 9th | +4 | 5d6 |Roguish Archetype Feature |
| 10th | +4 | 5d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 11th | +4 | 6d6 |[[Reliable Talent]] |
| 12th | +4 | 6d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 13th | +5 | 7d6 |Roguish Archetype Feature |
| 14th | +5 | 7d6 |[[Blindsense]] |
| 15th | +5 | 8d6 |[[Slippery Mind]] |
| 16th | +5 | 8d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 17th | +6 | 9d6 |Roguish Archetype Feature |
| 18th | +6 | 9d6 |[[Elusive]] |
| 19th | +6 | 10d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 20th | +6 | 10d6 |[[Stroke of Luck]] |
Beginning at 7th level, you can nimbly dodge out of the way of certain area effects, such as an ancient red dragon’s fiery breath or an ice storm spell. When you are subjected to an effect that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on the saving throw, and only half damage if you fail.
At 1st level, choose two of your skill proficiencies, or one of your skill proficiencies and your proficiency with thieves’ tools. Your proficiency bonus is doubled for any ability check you make that uses either of the chosen proficiencies.

At 6th level, you can choose two more of your proficiencies (in skills or with thieves’ tools) to gain this benefit.
{{Rogue Expertise}}
Starting at 5th level, when an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you.
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9wa4AsGdMfJcJiMLprB6XZw/XXLe3Dx/I6r4/deOP8fowfYdhbo52I2+FKXuCKIwlioeBK55nhoUmk5KaLJmPJZ4vnImTGqSUkKchpZesE6Koq5Covq+lDLKitJm+t5m+CbS8LrIQwLfCw8EterjDz4rNzZ3CF9fHet/VGMoX099i1ebdroPb59hb6uoSqxzg4FP29n4Q5BD7+Uz1/R+s6PXpmA8yj8w0WwoJKECvGFcsBQX5OI8SA+XEARXZT+jBw7UpziMaTIilJGmjy5zArKlSwPqiR4oOU3Awy39Asm85mCmzYlMsjpyyLJnuIAAv0VQSOamQaPVvKXLk3Rpk7NJZ3qRunVquSEYpXjE+HRrVqzNfS60mHYPQHRmnRb9k/CBifpti01F6NIvTBvcf0LLRngwS4FEz7MBhhfxFUVG2WM0nE5yBwlO6N81jI1zF81Z4pIM63nFjxDHyw9elFc0xcDDE0tg+nie7Jh58EG1yrOlLZ91CJ7D8Hv3kNOPQ4uHCnxI4XFtraLfDmRbsBnkZWO5yn20dq3a+7uXTL48IrHk/f7/Lyr5urxpm/P6T18RfLnA6pvnw/+/Nn+o/Pvb91/9wUooFwEFsjWgQgCSN2CDCbm4IC6RfhgVxSaNeGFJdVTHYdiaahGg7uJGBOJIPKA3CY/KXgiirG4ZolxLYaI2oxA3GXjdOYMx5qFOf6QoXLJ+fgjkEQKOWSRIULHHk1KymPLky8hKeVGL1YJ0pVYWknllhNp6aUTMoYppi5kfjnmmQOZqeZCbLaJRGBwMvfmnDSCaWdxdeYphJx89rnnn0amKeiNgRbqIqGI0nHoojn46egOkEb6aKOU9qHopTdMqimmeHbqaZegzsDpqLFlauqpn6ZqyKqsqibqq7BGKSuprtbKAqq45nrrrqD06msqsQYLCbDEEmP+7LGb0aqsCro2i+yw0C5r3rS7MGvttdVmS22T3F7m7bfGJCvuZNuWOy626HIj7brmhuvuu/vFa0+79EKl7r3y+qcvVef2i++/AE9A7sBMzmuwcwgnfDC/DOeW4cPHOSzxbBRXPOLCGJco8MY75evxih2HzDG8JA+pccggn5wxiyyXfDHJK7/co8s0z3zzyCzj/DLPO+t8ss9BAy0z0SqbnHPKRyvtsdFLx1w0001LvTHSSdtMM4xQR4311Spm3bCJYFvdM9UYk/3z1k9/DbbFYmeN9tBqTz131WZXHDfXbLfd8tteR8y31l2XXffZd0uct94QBu62h4yj7Dfcg/8+TeTjhdMdueSZa7744x9v/rfnDYvOJOmlm74Y6qmr/jnrH7v+OuzJyT477aHZHhPuuu/Oe+++/w588MIDUwAAOw==
|top|k
| !Level | !Proficiency Bonus | !Sneak Attack | !Features |
| 1st | +2 | 1d6 |<<list-abilities 1>> |
| 2nd | +2 | 1d6 |<<list-abilities 2>> |
| 3rd | +2 | 2d6 |<<list-abilities 3>> |
| 4th | +2 | 2d6 |<<list-abilities 4>> |
| 5th | +3 | 3d6 |<<list-abilities 5>> |
| 6th | +3 | 3d6 |<<list-abilities 6>> |
| 7th | +3 | 4d6 |<<list-abilities 7>> |
| 8th | +3 | 4d6 |<<list-abilities 8>> |
| 9th | +4 | 5d6 |<<list-abilities 9>> |
| 10th | +4 | 5d6 |<<list-abilities 10>> |
| 11th | +4 | 6d6 |<<list-abilities 11>> |
| 12th | +4 | 6d6 |<<list-abilities 12>> |
| 13th | +5 | 7d6 |<<list-abilities 13>> |
| 14th | +5 | 7d6 |<<list-abilities 14>> |
| 15th | +5 | 8d6 |<<list-abilities 15>> |
| 16th | +5 | 8d6 |<<list-abilities 16>> |
| 17th | +6 | 9d6 |<<list-abilities 17>> |
| 18th | +6 | 9d6 |<<list-abilities 18>> |
| 19th | +6 | 10d6 |<<list-abilities 19>> |
| 20th | +6 | 10d6 |<<list-abilities 20>> |
At 3rd level, you choose an archetype that you emulate in the exercise of your rogue abilities: Thief, detailed at the end of the class description, or one from another source. Your archetype choice grants you features at 3rd level and then again at 9th, 13th, and 17th level.
R0lGODlhAAEAAaEBAAAAAP///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmaQCqowLoC8fyvLQrY9/0zvc+lNMpgsKf8YgkEYuIJTMJjUpZTheuap1qt1DsM+XNcsdkWPgbOKPL7PZFjYav3fR6Qh7Hi+18uz7/1yfY9tfSUGg4qCiFmFjTOLcoiQLpOFQZOan5gWl515m5KWoB6tlUGjqqeogK2LoKO9FqwzqbGqtpS3ule4sr2Lv7GOz760YsfIlcbMy1nPz5zNzcJW16YA1NXZatjd19vc0I7p1GHi5udJ7Du55evY5uHr/3TkN/i29/797Rv3+CXEBwAJVk43GwoAdpURgqzLCMDbKHFYIp6kURiC3+VRszKgMlDpVHMJgognxY8gU7iPJCVALYKIYTlkvMIEpXyKYXmjtV6qEmRyccKlSC+jzTLMzRnO1qBVpa01jUgSmHrekktKWoaRRmFUXnlVK9kV0xtis3ryNZdRHPonW4Fuozp0Hoto3L6d9HInYT4i2LbyzJmW7P/S1Mr29dxfHiBiaMeLHVxyvtUe45GQvjy1yPcVYaeerez6Ivkh4auvSp06DpsMazGfLo15jH0f6ZWna020Z78I6ZW/fu37CzEi8eXPi340xLML+ZvErs59KdU0eeGfvw60itc1czvXv278rzkq+9vfns85K9s1e9/GV07mLf853ferz9+vb+0aatut5+VPUH1iv4HWfce1+dpN95CbIXnnrpQSgXhQ3KdyF9FTp4oHarCbjhdxEC1+FrMhA4IokBXnciiCuWsiB5LVqYIYMvIjgjhzXCWOJn/MjYI3Q73vajiEEKeSNvRbJ4JJIT4jiDjkmqNSVrCGk4ZFhNNrYDlllqWSVpV1KXoi5lUuYbmVsC+CRtPqj5pVlxBvYmc2fKGSaaaUKZJzF3crnnb3/i2Seggbo5KKEfEvkDcYlatOZcjSr5qKLxmcgWo3PCVShBR2jaKadt6pmplZFaOthpSCC6qV+tinooZzGKeSqVpcpaq5+5ipSEqpVa8yuqY+L6qkC72nj+62PBujqqYUUWa+axE0kLyTDuQQtms75S62Ra7tVz2ayCciuhtwaZEi65uqrb24ffYoustpjCG6+5I1S2qF7yshpqtv99C64+7N7Vr4GLAlwwj/QKvLCKlyKcMJv5orcvxalqtqzDqUJccbRDylLuxwNjnC/HEwOb3BvtRpBfxNVuB3DAxgbHk8Uakexyt/8JthC+l6Jc4wbiqVxdwx7ubEJ7P0saNAc2AwbfxbAibfLSBDdr3n1C49yxwksn7bPU02boktZOF2300F/HnPPRYvtHNNykoN21xDvz7I/Sb3t8471hb13e3rZKDfbfQJP9gNln3Sw31ycrGnXPhk/+LfgcgW8sLt53/12511YXHjbllSdO93CkR775W0yfDLo3q2t7OurzxK543yOP1/o1Vz/OudUt/e44765AOmHuT+zue++Cf5W5fy0Lj1WAxo81dpXNXyXP89Djve7j01MvbOq1j14U7bJr3/nLT36fdu/E12L++Ntfj6H3MR/Pd9vyu0s/9k+jermzjU9Y+XNK//z3v8GJ73vgM5j+lLebA3JPbdsLWQAFOEB/JU9ndJGgBHmmwAsCLoO8SltFlAeeFH0whdJjoAkzprnseLBMMMSf7DCot/ShpmFzy+EGnbdDozVoQCS02w+DKIHLsTBONRwiAxtoRPGtLIlKpGD+Bd0XvRURMYf10uHTphM/Hx5RjF0sXdnKk0WXnfCLUrQcbuh1oS1yLopRjE4YIfiUNcXxiVAM2RjZeMXsfZGDbbRi8M4In/rVbX+L7N8KUaix5cmxHJH8oxn7dUc3+rGQwQMkDn1YSU4CMpSSrNSjEMfHVz3yfOqLTCaXuEjdHRIEFiNkHUU5y8+tcn9+9OQIo5bHnPkNgv9iHCFxSclcSg6NbvOiMmsWwzUqMpCu86UGbPbGtp1LblBrZaGaxsc+os+Zl8wbMUHWRWQKZpxZYyYsqflMaHbGkkikJs0mOcd3wrOcn9TKK21Zz87xx53j9BwtRcgtFU5poMrRJzn+rdnDG7YPiNhk5zIvacWHxhMDEFVnMOWVMnzmc5YaNOcokXfEkIZznbkkUBE8Bc4rMhSYJHUpw/ZoPZFOroo2TUxqVLpSlkaup8oKDVDvJ7/AEbWortxRiEA51KXSCTF2nGlDeSnVqRamqjodqSCzetP0cDWoQi0QWMMKM5F1NZlfPatPJzOfp5LRrG5Fa3zialV31rCu3vyEQvPKyF3ytYBUzKgIAmrMwRqqmxvtJ0JjqVgF/vOcJu2oRyMbPvw86LEaxSxhV7hZidLTs9VLbGN/CVHSksq0p70mYieq2mPCM7Sije1qH0nbwI7Wtp9lolx1exiJTHGbhg2uZ17+i8jiGle4yD2oQ5d73Ocmt7XQ3UJz28nZ6nLDotgVo3aBYVmO8vO7gxivc71LXkmItrLzHBlvD4ve8+YDnbztHlHoG03zdJNl9S3t4tBpXd3217/rMc0FB5zZBfaBuwgu6fxcI93ONpiVEe5VM3c74cBmUwubxHCGIyHbWG34gapl7XDrNE3IDtjEF14SKSX83slWOEcpVnGJZTxjGveVxGdl8Yg/lU4Pe9bHJ7bwLS+LWSJfd1VH/jDcgszhGu9zsDgOL5N3bOOlKpm728WykLVcZfNGt8NIJuqWqdtl2db3zNmtg5e/rKAwA3cRLy4zjY60jTonWc7c5AiZ7cz8JMHmFxZ/5iuf/ZmUH2d5XIMiy0dhy9Q//eXRi96WpIOraDhbukPVzTSMaYVb8rYY0Lf1bXqRyWZTgfbU9jx0qcPEarwK+q2ajfWIUh3pLNn6zLimtVp3zetZMyunwMZvAEF11GIbW8OqDo+yXavMTaPy2dA+cLroR+3uNi7XOM32ReOr1c14m7jE9PWLxs0+V6fRiehOt7BDvN5295O/h+uLvKPUZ9Ht5d5XYqxkWcHvMTs44JNIMMHV68CDx6KECv8FlBu+FSlDfBVvnjjF/2xxPxc54w5fMscJrdyPdxzNIh+FmEsulTmjPOV9Xnmi2+vymMt85jSPSwEAADs=
This 60-foot length of silk rope weighs 3 pounds and can hold up to 3,000 pounds. If you hold one end of the rope and use an action to speak the command word, the rope animates. As a bonus action, you can command the other end to move toward a destination you choose. That end moves 10 feet on your turn when you first command it and 10 feet on each of your turns until reaching its destination, up to its maximum length away, or until you tell it to stop. You can also tell the rope to fasten itself securely to an object or to unfasten itself, to knot or unknot itself, or to coil itself for carrying.

If you tell the rope to knot, large knots appear at 1-foot intervals along the rope. While knotted, the rope shortens to a 50-foot length and grants advantage on checks made to climb it.

The rope has <<ac 20>> and <<hp 20>>. It <<heal 1>> every <<time 5m>> as long as it has at least <<hp 1>>. If the rope drops to <<hp 0>>, it is destroyed.
This rope is 30 feet long and weighs 3 pounds. If you hold one end of the rope and use an action to speak its command word, the other end darts forward to entangle a creature you can see within 20 feet of you. The target must succeed on a <<save Dex 15>> or become [[Restrained]].

You can release the creature by using a bonus action to speak a second command word. A target [[Restrained]] by the rope can use an action to make a <<skillcheck "Str or Dex" 15>> (target’s choice). On a success, the creature is no longer [[Restrained]] by the rope.

The rope has <<ac 20>> and <<hp 20>>. It regains <<heal 1>> every <<time 5m>> as long as it has at least <<hp 1>>. If the rope drops to <<hp 0>>, it is destroyed.
You touch a length of rope that is up to 60 feet long. One end of the rope then rises into the air until the whole rope hangs perpendicular to the ground. At the upper end of the rope, an invisible entrance opens to an extradimensional space that lasts until the spell ends.

The extradimensional space can be reached by climbing to the top of the rope. The space can hold as many as eight Medium or smaller creatures. The rope can be pulled into the space, making the rope disappear from view outside the space.

Attacks and spells can’t cross through the entrance into or out of the extradimensional space, but those inside can see out of it as if through a 3-foot-by-5-foot window centered on the rope.

Anything inside the extradimensional space drops out when the spell ends.
"""
''False Appearance.'' While the roper remains motionless, it is indistinguishable from a normal cave formation, such as a stalagmite.
''Grasping Tendrils.'' The roper can have up to six tendrils at a time. Each tendril can be attacked (<<ac 20>>; <<hp 10>>; immunity to poison and psychic damage). Destroying a tendril deals no damage to the roper, which can extrude a replacement tendril on its next turn. A tendril can also be broken if a creature takes an action and succeeds on a <<skillcheck Str 15>> against it.
''Spider Climb.'' The roper can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
"""
<<divider>>
''Multiattack.'' The roper makes four attacks with its tendrils, uses Reel, and makes one attack with its bite.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 4d8+4>> |<<reach 5>> |
| !<<melee Tendril +7>>|No damage |<<reach 50>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 15>>). Until the grapple ends, the target is [[Restrained]] and has disadvantage on Strength checks and Strength saving throws, and the roper can’t use the same tendril on another target. |<|
| !Reel|The roper pulls each creature grappled by it up to 25 feet straight toward it. |<|
"""
''Antimagic Susceptibility.'' The rug is [[Incapacitated]] while in the area of an antimagic field. If targeted by [[Dispel Magic]], the rug must succeed on a <<save Con>> against the caster’s spell save DC or fall unconscious for <<time 1m>>.
''Damage Transfer.'' While it is grappling a creature, the rug takes only half the damage dealt to it, and the creature [[Grappled]] by the rug takes the other half.
''False Appearance.'' While the rug remains motionless, it is indistinguishable from a normal rug.
"""
[img[divider.png]]

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Smother +5>>| &mdash; |<<reach 5>> |
|~|''On Hit:'' The creature is [[Grappled]], <<save Escape 13>>. Until this grapple ends, the target is [[Restrained]], [[Blinded]], and at risk of suffocating, and the rug can’t smother another target. In addition, at the start of each of the target’s turns, the target takes <<bludgeoning 2d6+3>>. |<|

<<htabs "[tag[Rule]tag[Category]sort[order]]">>
<div class="tc-table-of-contents">

<<toc-selective-expandable "RuleMenu"  "sort[order]">>

</div>
"""
''Iron Scent.'' The rust monster can pinpoint, by scent, the location of ferrous metal within 30 feet of it.
''Rust Metal.'' Any nonmagical weapon made of metal that hits the rust monster corrodes. After dealing damage, the weapon takes a permanent and cumulative −1 penalty to damage rolls. If its penalty drops to −5, the weapon is destroyed. Nonmagical ammunition made of metal that hits the rust monster is destroyed after dealing damage.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d8+1>> |<<reach 5>> |
| !Antennae|The rust monster corrodes a nonmagical ferrous metal object it can see within 5 feet of it. If the object isn’t being worn or carried, the touch destroys a 1-foot cube of it. If the object is being worn or carried by a creature, the creature can make a <<save Dex 11>> to avoid the rust monster’s touch.<br/>&nbsp;<br/>If the object touched is either metal armor or a metal shield being worn or carried, its takes a permanent and cumulative −1 penalty to the AC it offers. Armor reduced to an <<ac 10>> or a shield that drops to a +0 bonus is destroyed. If the object touched is a held metal weapon, it rusts as described in the Rust Metal trait. |<|
"""
''Keen Smell.'' The tiger has advantage on Wisdom (Perception) checks that rely on smell.
''Pounce.'' If the tiger moves at least 20 feet straight toward a creature and then hits it with a claw attack on the same turn, that target must succeed on a <<save Str 14>> or be knocked [[Prone]]. If the target is prone, the tiger can make one bite attack against it as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +6>>|<<piercing 1d10+5>> |<<reach 5>> |
| !<<melee Claw +6>>|<<slashing 2d6+5>> |<<reach 5>> |
Flame-like radiance descends on a creature that you can see within range. The target must succeed on a Dexterity saving throw or take 1d8 radiant damage. The target gains no benefit from cover for this saving throw.
When you reach 3rd level, you swear the oath that binds you as a paladin forever. Up to this time you have been in a preparatory stage, committed to the path but not yet sworn to it. Now you choose the Oath of Devotion detailed at the end of the class description or one from another source.

Your choice grants you features at 3rd level and again at 7th, 15th, and 20th level. Those features include oath spells and the Channel Divinity feature.

!!! Oath Spells

Each oath has a list of associated spells. You gain access to these spells at the levels specified in the oath description. Once you gain access to an oath spell, you always have it prepared. Oath spells don’t count against the number of spells you can prepare each day.

If you gain an oath spell that doesn’t appear on the paladin spell list, the spell is nonetheless a paladin spell for you.

!!! Channel Divinity

Your oath allows you to channel divine energy to fuel magical effects. Each Channel Divinity option provided by your oath explains how to use it.

When you use your Channel Divinity, you choose which option to use. You must then finish a short or long rest to use your Channel Divinity again.

Some Channel Divinity effects require saving throws. When you use such an effect from this class, the DC equals your paladin spell save DC.
As an action, you can imbue one weapon that you are holding with positive energy, using your [[Channel Divinity]]. For 1 minute, you add your Charisma modifier to attack rolls made with that weapon (with a minimum bonus of +1). The weapon also emits bright light in a 20-foot radius and dim light 20 feet beyond that. If the weapon is not already magical, it becomes magical for the duration.

You can end this effect on your turn as part of any other action. If you are no longer holding or carrying this weapon, or if you fall unconscious, this effect ends.
"""
''Blood Frenzy.'' The sahuagin has advantage on melee attack rolls against any creature that doesn’t have all its hit points.
''Limited Amphibiousness.'' The sahuagin can breathe air and water, but it needs to be submerged at least once every 4 hours to avoid suffocating.
''Shark Telepathy.'' The sahuagin can magically command any shark within 120 feet of it, using a limited telepathy.
"""
<<divider>>
''Multiattack.'' The sahuagin makes two melee attacks: one with its bite and one with its claws or spear.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<piercing 1d4+1>> |<<reach 5>> |
| !<<melee Claws +3>>|<<slashing 1d4+1>> |<<reach 5>> |
| !<<ranged Spear +3>>|<<piercing 1d6+1>><br/><<piercing 1d8+1>> (''Two-handed'') |<<reach 5>><br/><<range 20/60>> |
"""
''Heated Body.'' A creature that touches the salamander or hits it with a melee attack while within 5 feet of it takes <<fire 2d6>>.
''Heated Weapons.'' Any metal melee weapon the salamander wields deals an extra <<fire 1d6>> on a hit (included in the attack).
"""
<<divider>>
''Multiattack.'' The salamander makes two attacks: one with its spear and one with its tail.

|max top|k
| !<<action>> Actions |<|<|
| !<<ranged Spear +7>>|<<piercing 2d6+4>> + <<fire 1d6>><br/><<piercing 2d8+4>> + <<fire 1d6>> |<<reach 5>><br/><<range 20/60>> |
| !<<melee Tail +7>>|<<bludgeoning 2d6+4>> + <<fire 2d6>> |<<reach 10>> |
|~|The target is [[Grappled]] (<<skillcheck Escape 14>>). Until this grapple ends, the target is [[Restrained]], the salamander can automatically hit the target with its tail, and the salamander can’t make tail attacks against other targets. |<|
|max top|k
|!Source |https://dnd.wizards.com/charactersheets |
|!Race |[[High Elf]] |
|!Class |[[Wizard]] 1 |

<<htabs "[tag[Sample High Elf Wizard]sort[order]]">>
<<spelltable "[[Burning Hands]] [[Detect Magic]] [[Mage Armor]] [[Magic Missile]] [[Shield]] [[Thunderwave]]">>
|max top|k
| !Background |<|
|!Faction |<<org "Lord's Alliance">> |
|!Background |''Noble.'' You were raised wanting for nothing, giving you a clarity of purpose that outweighs pedestrian survival. You know that your potential is limitless, and you aim to make use of your gods-given talents. |
|!Background Feature |''Position of Privilege.'' You are welcome in high society, and people assume you have the right to be wherever you are. The common folk make every effort to accommodate you and avoid your displeasure, and other people of high birth treat you as a member of the same social sphere. You can secure an audience with a local noble if you need to. |
|!Personality Trait |No one could doubt by looking at your regal bearing that you are a cut above the unwashed masses. |
|!Ideal |It is your duty to protect and care for the people beneath you. |
|!Bond |The common folk must see you as a hero of the people. |
|!Flaw |You too often hear veiled insults and threats in every word addressed to you, and you are quick to anger. |
<<spelltable "[[Acid Splash]] [[Fire Bolt]] [[Ray of Frost]] [[Shocking Grasp]]">>
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +5>>|<<piercing 1d6+3>> |<<reach 5>> |
| !<<casted "Fire Bolt" +5>>|<<fire 1d10>> |<<range 120>> |
"""
[[Scholar's Pack]]
Shortsword
Wand
Component Pouch
[[Sample High Elf Wizard Spellbook]]
Three-Dragon Ante set
Money (24 gp)
"""
!! High Elf Traits

''Fey Ancestry.'' You have advantage on saving throws against being charmed, and magic can’t put you to sleep.

''Darkvision.'' You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray.

''Trance.'' You don’t require sleep. Instead, you meditate deeply, semiconscious, for 4 hours a day. After resting in this way, you gain the same benefit that a human does from 8 hours of sleep.

!! Wizard Features

''Spellcasting Abiiity.'' You have the ability to cast spells. Intelligence is your spellcasting ability for your wizard spells. You use your Intelligence whenever a spell refers to your spellcasting ability.

You prepare the list of wizard spells that are available for you to cast. To do so, choose 4 spells. The spells must be of a level for which you have spell slots. 

To cast a spell, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

You can use an arcane focus as a spellcasting focus for your wizard spells. 

You can cast any wizard spell in your spellbook as a ritual if that spell has the ritual tag.

''Arcane Recovery.'' Once per day when you finish a short rest, you can choose expended spell slots to recover. The spell slots can have a combined level equal to or less than 1.
|max top|k
| !Proficiencies |<|
|!Armor		 |None |
|!Weapons	 |Daggers, darts, slings, quarterstaffs, longswords, shortswords, shortbows, longbows |
|!Tools		 |Playing cards |
|!Languages	 |Common, Elvish, Draconic |
|!Skills		 |Arcana, History, Investigation, Perception, Persuasion |

<div style="display: flex;">
<<stat Passive 13 Perception>>
<<stat Passive 15 Investigation>>
<<stat Passive 11 Insight>>
</div>

<div style="display: flex;">

| !Strength |<|<|
|!Athletics (Str)			 | <<skill 0>>	 | 0 |
| !Dexterity |<|<|
|!Acrobatics (Dex)		 | <<skill 0>>	 | +3 |
|!Sleight of Hand (Dex)	 | <<skill 0>>	 | +3 |
|!Stealth (Dex)			 | <<skill 0>>	 | +3 |
| !Intelligence |<|<|
|!Arcana (Int)			 | <<skill 1>>	 | +5 |
|!History (int)			 | <<skill 1>>	 | +5 |
|!Investigation (Int)		 | <<skill 1>>	 | +5 |
|!Nature (Int)			 | <<skill 0>>	 | +3 |
|!Religion (Int)			 | <<skill 0>>	 | +3 |

&nbsp;&nbsp;&nbsp;

| !Wisdom |<|<|
|!Animal Handling (Wis)	 | <<skill 0>>	 | +1 |
|!Insight (Wis)			 | <<skill 0>>	 | +1 |
|!Medicine (Wis)		 | <<skill 0>>	 | +1 |
|!Perception (Wis)		 | <<skill 1>>	 | +3 |
|!Survival (Wis)			 | <<skill 0>>	 | +1 |
| !Charisma |<|<|
|!Deception (Cha)		 | <<skill 0>>	 | -1 |
|!Intimidation (Cha)		 | <<skill 0>>	 | -1 |
|!Performance (Cha)	 | <<skill 0>>	 | -1 |
|!Persuasion (Cha)		 | <<skill 1>>	 | +1 |
</div>

| !<<skill 0>> | Not proficient | !<<skill 1>> | Proficient | !<<skill 2>> | Expertise |
<div style="display: flex;">
<<stat Spell 13 DC>>
<<stat Spell +5 Attack>>
</div>

<<htabs "[tag[Sample High Elf Wizard Spellbook]sort[order]]">>
<div style="display: flex;">
<<ability Strength 10 0 0>>
<<ability Dexterity 16 +3 +3>>
<<ability Constitution 12 +1 +1>>
<<ability Intelligence 16 +3 "''+5''">>
<<ability Wisdom 13 +1 "''+3''">>
<<ability Charisma 8 -1 -1>>
</div>

<div style="display: flex;">
<<stat Armor 13 Class>>
<<stat "''Mage''" "''16''" "''Armor''">>
<<stat Hit 7 Points>>
</div>
<div style="display: flex;">
<<stat Proficiency +2 Bonus>>
<<stat Initiative +3>>
</div>
<div style="display: flex;">
<<stat Walking "30 ft" Speed>>
</div>

|max top|k
|!Source |https://dnd.wizards.com/charactersheets |
|!Race |[[Human]] |
|!Class |[[Fighter]] 1 |
|!Faction |<<org "Order of the Gauntlet">> |
|!Background |''Soldier.'' You were a professional soldier. You traveled to foreign lands, led troops into danger, fought wars under the banners of different commanders. Yet, you craved something more out of life, and resigned your commission. Now you are out on your own, living by your wits, taking orders from no one. |
|!Background Feature |''Military Rank.'' You were a low-ranked officer in a military organization. Soldiers loyal to your former military organization still recognize your authority and influence, and they defer to you if they are of a lower rank. |
|!Personality Trait |You can stare down a hell hound without flinching. |
|!Ideal |When people follow orders blindly, they embrace a kind of tyranny. |
|!Bond |You fight for those who cannot fight for themselves. |
|!Flaw |You’d rather eat your armor than admit when you’re wrong. |
| !Proficiencies |<|
|!Armor		 |All, Shields |
|!Weapons	 |Simple Weapons, Martial Weapons |
|!Tools		 |Gaming Dice, Vehicles (Land) |
|!Languages	 |Common, Orc |
|!Skills		 |Athletics, History, Intimidation, Perception |

<div style="display: flex;">
<<ability Strength 16 +3 "''+5''">>
<<ability Dexterity 9 -1 -1>>
<<ability Constitution 15 +2 "''+4''">>
<<ability Intelligence 13 +1 +1>>
<<ability Wisdom 11 0 0>>
<<ability Charisma 14 +2 +2>>
</div>

<div style="display: flex;">
<<stat Armor 18 Class>>
<<stat Hit 12 Points>>
</div>
<div style="display: flex;">
<<stat Proficiency +2 Bonus>>
<<stat Initiative -1>>
</div>
<div style="display: flex;">
<<stat Walking "30 ft" Speed>>
</div>

<div style="display: flex;">
<<stat Passive 14 Perception>>
<<stat Passive 17 Investigation>>
<<stat Passive 14 Insight>>
</div>

<div style="display: flex;">

| !Strength |<|<|
|!Athletics (Str)			 | <<skill 1>>	 | +5 |
| !Dexterity |<|<|
|!Acrobatics (Dex)		 | <<skill 0>>	 | -1 |
|!Sleight of Hand (Dex)	 | <<skill 0>>	 | -1 |
|!Stealth (Dex)			 | <<skill 0>>	 | -1 |
| !Intelligence |<|<|
|!Arcana (Int)			 | <<skill 0>>	 | +1 |
|!History (int)			 | <<skill 1>>	 | +3 |
|!Investigation (Int)		 | <<skill 0>>	 | +1 |
|!Nature (Int)			 | <<skill 0>>	 | +1 |
|!Religion (Int)			 | <<skill 0>>	 | +1 |

&nbsp;&nbsp;&nbsp;

| !Wisdom |<|<|
|!Animal Handling (Wis)	 | <<skill 0>>	 | 0 |
|!Insight (Wis)			 | <<skill 0>>	 | 0 |
|!Medicine (Wis)		 | <<skill 0>>	 | 0 |
|!Perception (Wis)		 | <<skill 1>>	 | +2 |
|!Survival (Wis)			 | <<skill 0>>	 | 0 |
| !Charisma |<|<|
|!Deception (Cha)		 | <<skill 0>>	 | +2 |
|!Intimidation (Cha)		 | <<skill 1>>	 | +4 |
|!Performance (Cha)	 | <<skill 0>>	 | +2 |
|!Persuasion (Cha)		 | <<skill 0>>	 | +2 |
</div>

| !<<skill 0>> | Not proficient | !<<skill 1>> | Proficient | !<<skill 2>> | Expertise |

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +5>>|<<slashing 1d8+3>> |<<reach 5>> |
| !<<melee Pike +5>>|<<slashing 1d10+3>> |<<reach 10>> |
| !<<ranged Javelin +5>>|<<slashing 1d6+3>> |<<reach 5>><br/><<range 30/120>> |
| !<<action>> Bonus Actions |<|<|
| !Second Wind|<<heal 1d10+1>> |<|
| !<<reaction>> Reactions |<|<|
| !Protection|Impose disadvantage on an attack against a target within 5 feet of you. |<|

!! Equipment

"""
Longsword
Pike
Javelin (5)
Chain mail
Shield
[[Dungeoneer's Pack]]
Potion of Healing
Money (30 gp, 5 sp)
"""
<<htabs "[tag[Sample Spellbook]sort[order]]">>
<<spelltable "[[Detect Magic]] [[Floating Disk]] [[Magic Missile]] [[Shield]]">>
<<spelltable "[[Misty Step]] [[Shatter]]">>
<<spelltable "[[Counterspell]] [[Dispel Magic]] [[Fireball]]">>
<<spelltable "[[Fire Bolt]] [[Mage Hand]] [[Message]] [[Prestidigitation]]">>
You ward a creature within range against attack.
Until the spell ends, any creature who targets the warded creature with an attack or a harmful spell must first make a Wisdom saving throw. On a failed save, the creature must choose a new target or lose the attack or spell. This spell doesn’t protect the warded creature from area effects, such as the explosion of a fireball.

If the warded creature makes an attack or casts a spell that affects an enemy creature, this spell ends.
A satyr might carry panpipes that it can play to create magical effects. Usually, only one satyr in a group carries such pipes. If a satyr has pipes, it gains the following additional action option.

"""
''Panpipes.'' The satyr plays its pipes and chooses one of the following magical effects: a charming melody, a frightening strain, or a gentle lullaby. Any creature within <<range 60>> of the satyr that can hear the pipes must succeed on a <<save Wis 13>> or be affected as described below. Other satyrs and creatures that can’t be charmed are unaffected.

An affected creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to these panpipes for the next <<time 24h>>.

&nbsp;&nbsp;&nbsp;&nbsp;''Charming Melody.'' The creature is [[Charmed]] by the satyr for <<time 1m>>. If the satyr or any of its companions harms the creature, the effect on it ends immediately.
&nbsp;&nbsp;&nbsp;&nbsp;''Frightening Strain.'' The creature is [[Frightened]] for <<time 1m>>.
&nbsp;&nbsp;&nbsp;&nbsp;''Gentle Lullaby.'' The creature falls asleep and is [[Unconscious]] for <<time 1m>>. The effect ends if the creature takes damage or if someone takes an action to shake the creature awake.
"""
"""
''Magic Resistance.'' The satyr has advantage on saving throws against spells and other magical effects.
<<fold "Satyr Pipes, Variant">>
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Ram +3>>|<<bludgeoning 2d4+1>> |<<reach 5>> |
| !<<melee Shortsword +5>>|<<piercing 1d6+3>> |<<reach 5>> |
| !<<ranged Shortbow +5>>|<<piercing 1d6+3>> |<<range 80/320>> |
When you score a critical hit with a melee weapon attack, you can roll one of the weapon’s damage dice one additional time and add it to the extra damage of the critical hit.
If you hold this beetle-shaped medallion in your hand for 1 round, an inscription appears on its surface revealing its magical nature. It provides two benefits while it is on your person:

* You have advantage on saving throws against spells.
* The scarab has 12 charges. If you fail a saving throw against a necromancy spell or a harmful effect originating from an undead creature, you can use your reaction to expend 1 charge and turn the failed save into a successful one. The scarab crumbles into powder and is destroyed when its last charge is expended.
"""
''Price:'' 40 gp
1 Backpack
1 Book of Lore
1 Bottle of Ink
1 Ink Pen
10 Sheets of Parchment
1 Little Bag of Sand
1 Small Knife
"""
You focus your study on magic that creates powerful elemental effects such as bitter cold, searing flame, rolling thunder, crackling lightning, and burning acid. Some evokers find employment in military forces, serving as artillery to blast enemy armies from afar. Others use their spectacular power to protect the weak, while some seek their own gain as bandits, adventurers, or aspiring tyrants.

<<include "School of Evocation Advancement Table">>

---

!! School of Evocation Abilities

<<sections-vertical "[[Evocation Savant]] [[Sculpt Spells]] [[Potent Cantrip]] [[Empowered Evocation]] [[Overchannel]]">>

---

<<include "Wizard Ability">>
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 |[[Spellcasting|Wizard Spellcasting]], [[Arcane Recovery]] | 3 | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 |''Evoke:'' [[Evocation Savant]], [[Sculpt Spells]] | 3 | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 | — | 3 | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 4 | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 | — | 4 | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 |''Evoke:'' [[Potent Cantrip]] | 4 | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 | — | 4 | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 4 | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 | — | 4 | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 |''Evoke:'' [[Empowered Evocation]] | 5 | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 |''Evoke:'' [[Overchannel]] | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 |[[Spell Mastery]] | 5 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 |[[Signature Spells]] | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
You gain a +2 bonus to attack and damage rolls made with this magic weapon. In addition, you can make one attack with it as a bonus action on each of your turns.
You create three rays of fire and hurl them at targets within range. You can hurl them at one target or several. Make a ranged spell attack for each ray. On a hit, the target takes 2d6 fire damage.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Sting +2>>|<<piercing 1>> |<<reach 5>> |
|~|The target must make a <<save Con 9>>, taking <fail><<poison 1d8>></fail>, or <pass><<halved>></pass>. |<|
"""
''Keen Hearing and Sight.'' The scout has advantage on Wisdom (Perception) checks that rely on hearing or sight.
"""

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged Longbow +4>>|<<piercing 1d8+2>> |<<ranged 150/600>> |
You can see and hear a particular creature you choose that is on the same plane of existence as you. The target must make a W isdom saving throw, which is modified by how well you know the target and the sort of physical connection you have to it. If a target knows you’re casting this spell, it can fail the saving throw voluntarily if it wants to be observed.

<b>Knowledge Save Modifier</b>

* Secondhand (you have heard of the target) +5
* Firsthand (you have met the target)     &nbsp;+0
* Familiar (you know the target well)     -5

<b>Connection Save Modifier</b>

* Likeness or picture             &nbsp;-2
* Posession or garment            -4
* Body part, lock of hair, bit of nail, or the like -10

On a successful save, the target isn’t affected, and you can’t use this spell against it again for 24 hours.

On a failed save, the spell creates an invisible sensor within 10 feet of the target. You can see and hear through the sensor as if you w ere there. The sensor moves with the target, remaining within 10 feet of it for the duration. A creature that can see invisible objects sees the sensor as a luminous orb about the size of your fist.

Instead of targeting a creature, you can choose a location you have seen before as the target of this spell. When you do, the sensor appears at that location and doesn’t move.
Beginning at 2nd level, you can create pockets of relative safety within the effects of your evocation spells. When you cast an evocation spell that affects other creatures that you can see, you can choose a number of them equal to 1 + the spell’s level. The chosen creatures automatically succeed on their saving throws against the spell, and they take no damage if they would normally take half damage on a successful save.
''Prerequisite:'' 7th level

You can cast polymorph once using a warlock spell slot. You can’t do so again until you finish a long rest.

"""
''Amphibious.'' The hag can breathe air and water.
''Horrific Appearance.'' Any humanoid that starts its turn within 30 feet of the hag and can see the hag’s true form must make a <<save Wis 30>>. On a failed save, the creature is [[Frightened]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, with <<disadvantage>> if the hag is within line of sight, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to the hag’s Horrific Appearance for the next <<time 24h>>.
Unless the target is surprised or the revelation of the hag’s true form is sudden, the target can avert its eyes and avoid making the initial saving throw. Until the start of its next turn, a creature that averts its eyes has <<disadvantage>> on attack rolls against the hag.
"""
{{Hag Shared Spellcasting}}
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +5>>|<<slashing 2d6+3>> |<<reach 5>> |
| !Death Glare|The hag targets one [[Frightened]] creature she can see within <<range 30>> of her. If the target can see the hag, it must succeed on a <<save Wis 11>> against this magic or drop to <<hp 0>>. |<|
| !Illusory Appearance|The hag covers herself and anything she is wearing or carrying with a magical illusion that makes her look like an ugly creature of her general size and humanoid shape. The effect ends if the hag takes a <<ba>> to end it or if she dies.<br/>The changes wrought by this effect fail to hold up to physical inspection. For example, the hag could appear to have no claws, but someone touching her hand might feel the claws. Otherwise, a creature must take an <<action>> to visually inspect the illusion and succeed on a <<inveistigation 16>> to discern that the hag is disguised. |<|
"""
''Water Breathing.'' The sea horse can breathe only underwater.
"""
You have a limited well of stamina that you can draw on to protect yourself from harm. On your turn, you can use a bonus action to regain hit points equal to 1d10 + your fighter level. Once you use this feature, you must finish a short or long rest before you can use it again.
When you choose this archetype at 3rd level, you gain the ability to climb faster than normal; climbing no longer costs you extra movement.

In addition, when you make a running jump, the distance you cover increases by a number of feet equal to your Dexterity modifier.
You hide a chest, and all its contents, on the Ethereal Plane. You must touch the chest and the miniature replica that serves as a material component for the spell. The chest can contain up to 12 cubic feet of nonliving material (3 feet by 2 feet by 2 feet).

While the chest remains on the Ethereal Plane, you can use an action and touch the replica to recall the chest. It appears in an unoccupied space on the ground within 5 feet of you. You can send the chest back to the Ethereal Plane by using an action and touching both the chest and the replica.

After 60 days, there is a cumulative 5 percent chance per day that the spell’s effect ends. This effect ends if you cast this spell again, if the smaller replica chest is destroyed, or if you choose to end the spell as an action. If the spell ends and the larger chest is on the Ethereal Plane, it is irretrievably lost.
For the duration, you see invisible creatures and objects as if they were visible, and you can see into the Ethereal Plane. Ethereal creatures and objects appear ghostly and translucent.
This spell allows you to change the appearance of any number of creatures that you can see within range.
You give each target you choose a new, illusory appearance. An unwilling target can make a Charisma saving throw, and if it succeeds, it is unaffected by this spell.

The spell disguises physicial appearances as well as clothing, armor, weapons, and equipment. You can make each creature seem 1 foot shorter or taller and appear thin, fat, or inbetween. You can’t change a target’s body type, so you must choose a form that has the same basic arrangement of limbs. Otherwise, the extent of the illusion is up to you. The spell lasts for the duration, unless you use your action to dismiss it sooner.

The changes wrought by this spell fail to hold up to physical inspections. For example, if you use this spell to add a hat to a creature’s outfitm objects pass through the hat, and anyone who touches it would feel nothing or would feel the creature’s head and hair. If you use this spell to appear thinner then you are, the hand of someone who reaches out to touch you would bump into you while it was seemingly still in midair.

A creature can use its action to inspect a target and make an Intelligence (Investigation) check against your spell save DC. If it succeeds, it becomes aware that the target is disguised.
You send a short message of twenty-five words or less to a creature with you are familiar. The creature hears the message in its mind, regonizes you as the sender if it knows you, and can answer in a like manner immediately. The spell enables creatures with Intelligence scores of at least 1 to understand the meaning of your message.

You can send the message across any distance and even to other planes of existence, but if the target is on a different plane than you, there is a 5 percent chance that the message doesn’t arrive.
By means of this spell, a willing creature of an object can be hidden away, safe from detection for the duration.
When you cast the spell and touch the target, it becomes invisible and can’t be targeted by divination spells or perceived through scrying sensors created by the divination of spells.

If the target is a crreature, it falls into a state of suspended animation. Time ceases to flow for it, and it doesn’t grow older.

You can set a condition for the spell to end early. The condition can be anything you choose, but it must occur or be visible within 1 mile of the target. Examples include after 1,000 years or when the tarrasque awakes. This spells also ends if the target takes any damage.
"""
''Price per Dose:'' 200 gp
"""

This poison must be harvested from a dead or [[Incapacitated]] giant poisonous snake. 

* A creature subjected to this poison must succeed on a <<save Con 11>>,
** <fail><<poison 3d6>></fail>
** <pass><<halved>></pass>
<<list-icons "[tag[Setting]sort[]]" "No campaign settings found.">>
Sewer plague is a generic term for a broad category of illnesses that incubate in sewers, refuse heaps, and stagnant swamps, and which are sometimes transmitted by creatures that dwell in those areas, such as <<mob Rat>> and <<mob Otyugh>>.

!! Infection

When a humanoid creature is bitten by a creature that carries the disease, or when it comes into contact with filth or offal contaminated by the
disease, the creature must succeed on a <<save Con 11>> or become infected.

!! Symptoms

It takes <<time "1d4 days">> for sewer plague’s symptoms to manifest in an infected creature. Symptoms include fatigue and cramps. The infected creature:

* ''Symptoms''
** Fatigue, cramps.
** Suffers one level of [[Exhaustion]]
** Regains only half the normal number of hit points from spending Hit Dice
** Regains no hit points from finishing a long rest.
* ''At the end of each long rest'', <<save Con 11>>. 
** <fail>Gain one level of [[Exhaustion]]</fail>
** <pass>Lose one level of [[Exhaustion]]</pass>
*** When creature is no longer exhausted, creature recovers from the disease.
"""
''Amorphous.'' The shadow can move through a space as narrow as 1 inch wide without squeezing.
''Shadow Stealth.'' While in dim light or darkness, the shadow can take the Hide action as a bonus action.
''Sunlight Weakness.'' While in sunlight, the shadow has disadvantage on attack rolls, ability checks, and saving throws.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Strength Drain" +4>>|<<necrotic 2d6+2>> |<<reach 5>> |
|~|The target's Strength score is reduced by <<roll 1d4>>. The target dies if this reduces its Strength to 0. Otherwise, the reduction lasts until the target finishes a short or long rest.<br/>&nbsp;<br/>If a non-evil humanoid dies from this attack, a new <<mob Shadow>> rises from the corpse <<time 1d4h>> later. |<|
"""
''Lightning Absorption.'' Whenever the shambling mound is subjected to lightning damage, it takes no damage and regains a number of hit points equal to the lightning damage dealt.
"""
<<divider>>
''Multiattack.'' The shambling mound makes two slam attacks. If both attacks hit a Medium or smaller target, the target is [[Grappled]] (<<skillcheck Escape 14>>), and the shambling mound uses its Engulf on it.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +7>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
| !Engulf|The shambling mound engulfs a Medium or smaller creature [[Grappled]] by it. The engulfed target is [[Blinded]], [[Restrained]], and unable to breathe, and it must succeed on a <<save Con 14>> at the start of each of the mound’s turns or take <<bludgeoning 2d8+4>>. If the mound moves, the engulfed target moves with it. The mound can have only one creature engulfed at a time. |<|
You assume the form of a different creature for the duration.
The new form can be any creature with a challenge rating equal to your level or lower. The creature can’t be a construct or an undead, and you must have seen the sort of creature at least once. You transform into an average example of that creature, one without any class levels or the Spellcasting trait.

Your game statistics are replaced by the statistics of the chosen creature, though you retain your alignment and Intelligence, Wisdom, and Charisma scores You also retain all of your skill and saving throw proficiencies, in addition to gaining those of the creature, If the creature has the same proficiency as you, and the bonus listed in its statistics is higher than yours, use the creature’s bonus in place of yours. You can’t use any legendary actions or lair actions of the new form.

You assume the hit points and Hit Dice of the new form. When you revert to your normal, you return to the number of hit points you had before you transformed. If you revert as a result of dropping to 0 hit points, any excess damage carries over to your normal form. As long as the excess damage doesn’t reduce your normal form to 0 hitpoints, you aren’t knocked unconscious.

You retain the benefit of any features from your class, race, or other source and can use them, provided that your new form is physically capable of doing so. You can’t use any special senses you have (for example, darkvision) unless your new form also has that sense. You can only speak if the creature can normally speak.

When you transform, you choose whether your equipment falls to the ground, merges into the new form, or is worn by it. Worn equipment functions as normal. The DM determines whether it is practical for the new form to wear a piece of equipment, based on the creature’s shape and size. Your equipment doesn’t change shape or size to match the new form, and any equipment that the new form can’t wear must either fall to the ground or merge into your new form. Equipment that merges has no effect in that state.

During this spell’s duration, you can use your action to assume a different form following the same restrictions and rules for the original form, with one exception: if your new form has more hit pints than your current one, your hit points remain at their current value.
A sudden loud ringing noise, painfully intense, erupts from a point of your choice within range. Each creature in a 10-foot-radius sphere centered on that point must make a Constitution saving throw. A creature takes 3d8 thunder damage on a failed save, or half as much damage on a successful one. A creature made of inorganic material such as stone, crystal, or metal has disadvantage on this saving throw.

A nonmagical object that isn’t being worn or carried also takes the damage if it’s in the spell’s area.
As an acolyte, you command the respect of those who share your faith, and you can perform the religious ceremonies of your deity. You and your adventuring companions can expect to receive free healing and care at a temple, shrine, or other established presence of your faith, though you must provide any material components needed for spells. Those who share your religion will support you (but only you) at a modest lifestyle.

You might also have ties to a specific temple dedicated to your chosen deity or pantheon, and you have a residence there. This could be the temple where you used to serve, if you remain on good terms with it, or a temple where you have found a new home. While near your temple, you can call upon the priests for assistance, provided the assistance you ask for is not hazardous and you remain in good standing with your temple.
Reaction trigger: You are hit by an attack or targeted by the magic missile spell

An invisible barrier of magical force appears and protects you. Until the start of your next turn, you have a +5 bonus to AC, including against the triggering attack, and you take no damage from magic missile.
"""
''Bound.'' The shield guardian is magically bound to an amulet. As long as the guardian and its amulet are on the same plane of existence, the amulet’s wearer can telepathically call the guardian to travel to it, and the guardian knows the distance and direction to the amulet. If the guardian is within <<range 60>> of the amulet’s wearer, half of any damage the wearer takes (rounded up) is transferred to the guardian.
''Regeneration.'' The shield guardian regains <<heal 10>> at the start of its turn if it has at least <<hp 1>>.
''Spell Storing.'' A spellcaster who wears the shield guardian’s amulet can cause the guardian to store one spell of 4th level or lower. To do so, the wearer must cast the spell on the guardian. The spell has no effect but is stored within the guardian. When commanded to do so by the wearer or when a situation arises that was predefined by the spellcaster, the guardian casts the stored spell with any parameters set by the original caster, requiring no components. When the spell is cast or a new spell is stored, any previously stored spell is lost.
"""
<<divider>>
''Multiattack.'' The guardian makes two fist attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Fist +7>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
| !<<reaction>> Reactions |<|<|
| !Shield|When a creature makes an attack against the wearer of the guardian’s amulet, the guardian grants a <<ac +2>> to the wearer if the guardian is within <<range 5>> of the wearer. |<|
A shimmering field appears and surrounds a creature of your choice within range, granting it a +2 bonus to AC for the duration.
While holding this shield, you have resistance to damage from ranged weapon attacks.

''Curse.'' This shield is cursed. Attuning to it curses you until you are targeted by the remove curse spell or similar magic. Removing the shield fails to end the curse on you. Whenever a ranged weapon attack is made against a target within 10 feet of you, the curse causes you to become the target instead.
While holding this shield, you have a +1 bonus to AC. This bonus is in addition to the shield’s normal bonus to AC.
While holding this shield, you have a +2 bonus to AC. This bonus is in addition to the shield’s normal bonus to AC.
While holding this shield, you have a +3 bonus to AC. This bonus is in addition to the shield’s normal bonus to AC.
While holding this shield, you have a bonus to AC determined by the shield’s rarity. This bonus is in addition to the shield’s normal bonus to AC.
The wood of a club or quarterstaff you are holding is imbued with nature’s power.
For the duration, you can use your spellcasting ability instead of Strength for the attack and damage rolls of melee attacks using that weapon, and the weapon’s damage die becomes a d8. The weapon also becomes magical, if it isn’t already. The spell ends if you cast it again or if you let go of the weapon
Lightning springs from your hand to deliver a shock to a creature you try to touch.
Make a melee spell attack against the target. You have advantage on the attack roll if the target is wearing armor made of metal. On a hit, the target takes 1d8 lightning damage, and it can’t take reactions until the start of its next turn.
|max top|k
| !d100 | !Effect (lasts <<time "1d10 minutes">>) |
| !01–20 |The character retreats into his or her mind and becomes [[Paralyzed]]. The effect ends if the character takes any damage. |
| !21–30 |The character becomes [[Incapacitated]] and spends the duration screaming, laughing, or weeping. |
| !31–40 |The character becomes [[Frightened]] and must use his or her action and movement each round to flee from the source of the fear. |
| !41–50 |The character begins babbling and is incapable of normal speech or spellcasting. |
| !51–60 |The character must use his or her action each round to attack the nearest creature. |
| !61–70 |The character experiences vivid hallucinations and has disadvantage on ability checks. |
| !71–75 |The character does whatever anyone tells him or her to do that isn’t obviously self-destructive. |
| !76–80 |The character experiences an overpowering urge to eat something strange such as dirt, slime, or offal. |
| !81–90 |The character is [[Stunned]]. |
| !91–100 |The character falls [[Unconscious]]. |
Using the Attack action, you can make a special melee attack to shove a creature, either to knock it prone or push it away from you. If you're able to make multiple attacks with the Attack action, this attack replaces one of them.

The target of your shove must be no more than one size larger than you, and it must be within your reach. You make a Strength (Athletics) check contested by the target's Strength (Athletics) or Dexterity (Acrobatics) check (the target chooses the ability to use). If you win the contest, you either knock the target prone or push it 5 feet away from you.
"""
''False Appearance.'' While the shrieker remains motionless, it is indistinguishable from an ordinary fungus.
"""
<<divider>>

|max top|k
| !<<reaction>> Reactions |<|<|
| !Shriek|When bright light or a creature is within <<range 30>> of the shrieker, it emits a shriek audible within <<range 300>> of it. The shrieker continues to shriek until the disturbance moves out of range and for <<roll 1d4>> of the shrieker’s turns afterward. |<|
''Prerequisite:'' 15th level

You can cast invisibility at will, without expending a spell slot.

This painful infection causes bleeding from the eyes and eventually blinds the victim.

!! Infection

A beast or humanoid drinks water tainted by sight rot.

* <<save Con 15>> 
** <fail>Creature is infected by sight rot.</fail>

!! Symtoms

* ''After <<time 1d>>,'' vision become blurry.
** -1 to attack rolls and ability checks that rely on sight
** ''After each long rest.''
*** Penalty worsens by 1
*** When penalty reaches -5, creature is [[Blinded]] until sight is restored by magic such as [[Lesser Restoration]] or [[Heal]]

!! Cure

Sight rot can be cured using a rare flower called Eyebright, which grows in some swamps. Given an hour, a character who has proficiency with an herbalism kit can turn the flower into one dose of ointment. Applied to the eyes before a long rest, one dose of it prevents the disease from worsening after that rest. After three doses, the ointment cures the disease entirely.

''Prerequisite:'' 5th level

You can cast bestow curse once using a warlock spell slot. You can’t do so again until you finish a long rest.

When you reach 20th level, you gain mastery over two powerful spells and can cast them with little effort. Choose two 3rd-level wizard spells in your spellbook as your signature spells. You always have these spells prepared, they don’t count against the number of spells you have prepared, and you can cast each of them once at 3rd level without expending a spell slot. When you do so, you can’t do so again until you finish a short or long rest.

If you want to cast either spell at a higher level, you must expend a spell slot as normal.
For the duration, no sound can be created within or pass through a 20-foot-radius sphere centered on a point you choose within range. Any creature or object entirely inside the sphere is immune to thunder damage, and creatures are deafened while entirely inside it. Casting a spell that includes a verbal component is impossible there.
You create the image of an object, a creature, or some other visible phenomenon that is no larger than a 15-foot cube. The image appears at a spot within range and lasts for the duration. The image is purely visual; it isn’t accompanied by sound, smell, or other sensory effects.

You can use your action to cause the image to move to any spot within range. As the image changes location, you can alter its appearance so that its movements appear natural for the image. For example, if you create an image of a creature and move it, you can alter the image so that it appears to be walking.

Physical interaction with the image reveals it to be an illusion, because things can pass through it. A creature that uses its action to examine the image can determine that it is an illusion with a successful Intelligence (Investigation) check against your spell save DC. If a creature discerns the illusion for what it is, the creature can see through the image.
"""
''Mechanical Trap''
"""
A simple pit trap is a hole dug in the ground. The hole is covered by a large cloth anchored on the pit’s edge and camouflaged with dirt and debris.

|max top|k
|!Detection |<<perception 10>> to spot the pit. |
|!Trigger |Stepping on the camouflaged cloth. |
|!Effect |Target falls into the pit, taking falling damage based on the pit's depth. |
You shape an illusory duplicate of one beast or humanoid that is within range for the entire casting time of the spell.
The duplicate is a creature, partially real and formed from ice or snow, and it can take actions and otherwise be affected as a normal creature. It appears to be the same as the original, but it has half the creature’s hit point maximum and is formed without any equipment. Otherwise, the illusion uses all the statistics of the creature it duplicates.

The simulacrum is friendly to you and creatures you designate. It obeys your spoken commands, moving and acting in accordance with your wishes and acting on your turn in combat. The simulacrum lacks the ability to learn or become more powerful, so it never increases its level or other abilities, nor can it regain expended spell slots.

If the simulacrum is damaged, you can repair it in an alchemical laboratory, using rare herbs and minerals worth 100 gp per hit point it regains. The simulacrum lasts until it drops to 0 hit points, at which point it reverts to snow and melts instantly.

If you cast this spell again, any currently active duplicates you created with this spell are instantly destroyed.
|max|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged Shortbow +4>>|<<piercing 1d6+2>> |<<reach 80/320>> |
You gain proficiency in two skills of your choice.
This spell sends creatures into a magical slumber. Roll 5d8, the total is how many hit points of creatures this spell can affect. Creatures within 20 feet of a point you choose within range are affected in ascending order of their current hit points (ignoring [[Unconscious]] creatures).

Starting with the creature that has the lowest current hit points, each creature affected by this spell falls [[Unconscious]] until the spell ends, the sleeper takes damage, or someone uses an action to shake or slap the sleeper awake. Subtract each creature’s hit points from the total before moving on to the creature with the next lowest hit points. A creature’s hit points must be equal to or less than the remaining total for that creature to be affected.

Undead and creatures immune to being [[Charmed]] aren’t affected by this spell.
Until the spell ends, freezing rain and sleet fall in a 20-foot-tall cylinder with a 40-foot radius centered on a point you choose within range. The area is heavily obscured, and exposed flames in the area are doused.

The ground in the area is covered with slick ice, making it difficult terrain. When a creature enters the spell’s area for the first time on a turn or starts its turn there, it must make a Dexterity saving throw. On a failed save, it falls prone.

If a creature is concentrating in the spell’s area, the creature must make a successful Constitution saving throw against your spell save DC or lose concentration.
While you wear these light shoes, you can move up, down, and across vertical surfaces and upside down along ceilings, while leaving your hands free. You have a climbing speed equal to your walking speed. However, the slippers don’t allow you to move this way on a slippery surface, such as one covered by ice or oil.
By 15th level, you have acquired greater mental strength. You gain proficiency in Wisdom saving throws.
You alter time around up to six creatures of your choice in a 40-foot cube within range. Each target must succeed on a Wisdom saving throw or be affected by this spell for the duration.

An affected target’s speed is halved, it takes a -2 penalty to AC and Dexterity saving throws, and it can’t use reactions. On its turn, it can use either an action or a bonus action, not both. Regardless of the creature’s abilities or magic items, it can’t make more than one melee or ranged attack during its turn.

If the creature attempts to cast a spell with a casting time of 1 action, roll a d20. On an 11 or higher, the spell doesn’t take effect until the creature’s next turn, and the creature must use its action on that turn to complete the spell. If it can’t, the spell is wasted.

A creature affected by this spell makes another Wisdom saving throw at the end of its turn. On a successful save, the effect ends for it.
Beginning at 4th level, you can use your reaction when you fall to reduce any falling damage you take by an amount equal to five times your monk level.

<div style="display: flex;">
<<stat Small 10 Objects>>
<<stat Armor 16 Class>>
<<stat Hit 25 Points>>
</div>
<div style="display: flex;">
<<ability-value Strength 6>>
<<ability-value Dexterity 14>>
<<ability-value Constitution 10>>
<<ability-value Intelligence 3>>
<<ability-value Wisdom 3>>
<<ability-value Charisma 1>>
</div>

| !<<action>> Actions |<|<|
| !<<melee Slam +6>>|<<bludgeoning 1d8+2>> |<<reach 5>> |
Smith’s tools allow you to work metal, heating it to alter its shape, repair damage, or work raw ingots into useful items.

''Components.'' Smith’s tools include

* hammers
* tongs
* charcoal
* rags
* a whetstone.

''Arcana and History.'' Your expertise lends you additional insight when examining metal objects, such as weapons.

''Investigation.'' You can spot clues and make deductions that others might overlook when an investigation involves armor, weapons, or other metalwork.

''Repair.'' With access to your tools and an open flame hot enough to make metal pliable, you can restore 10 hit points to a damaged metal object for each hour of work.

| !Activity | !DC |
Sharpen a dull blade	10
Repair a suit of armor	15
Sunder a nonmagical metal object	15
Beginning at 1st level, you know how to strike subtly and exploit a foe’s distraction. Once per turn, you can deal an extra 1d6 damage to one creature you hit with an attack if you have advantage on the attack roll. The attack must use a finesse or a ranged weapon.

You don’t need advantage on the attack roll if another enemy of the target is within 5 feet of it, that enemy isn’t [[Incapacitated]], and you don’t have disadvantage on the attack roll.

The amount of the extra damage increases as you gain levels in this class, as shown in the Sneak Attack column of the Rogue table.
"""
''Angelic Weapons.'' The solar’s weapon attacks are magical. When the solar hits with any weapon, the weapon deals an extra <<radiant 6d8>> (included in the attack).
''Divine Awareness.'' The solar knows if it hears a lie.
''Innate Spellcasting.'' The solar’s spellcasting ability is Charisma (spell save DC 25). It can innately cast the following spells, requiring no material components:
//At will:// [[Detect Evil and Good]], [[Invisibility]] (self only)
//3/day each:// [[Blade Barrier]], [[Dispel Evil and Good]], [[Resurrection]]
//1/day each:// [[Commune]], [[Control Weather]]
''Magic Resistance.'' The solar has advantage on saving throws against spells and other magical effects.
"""
[img[divider.png]]
''Multiattack.'' The solar makes two greatsword attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +15>>|<<slashing 4d6+8>> + <<radiant 6d8>> |<<reach 5>> |
| !<<ranged "Slaying Longbow" +13>>|<<piercing 2d8+6>> + <<radiant 6d8>> |<<range 150/600>> |
|~|If the target is a creature that has 100 hit points or fewer, it must succeed on a <<save Con 15>> or die. |<|
| !Healing Touch|''3/Day''<br/>The deva touches another creature. The target magically regains <<heal 4d8+2>> and is freed from any curse, disease, poison, blindness, or deafness. |<|
| !Flying Sword|The solar releases its greatsword to hover magically in an unoccupied space within <<range 5>> of it. If the solar can see the sword, the solar can mentally command it as a bonus action to fly up to <<range 50>> and either make one attack against a target or return to the solar’s hands. If the hovering sword is targeted by any effect, the solar is considered to be holding it. The hovering sword falls if the solar dies. |<|
| !Healing Touch|''4/Day''<br/>The solar touches another creature. The target magically regains <<heal 8d8+4>> and is freed from any curse, disease, poison, blindness, or deafness. |<|
| !<<action>> Legendary Actions |<|<|
|The solar can take ''3'' legendary actions, choosing from the options below. Only one legendary action option can be used at a time and only at the end of another creature’s turn. The solar regains spent legendary actions at the start of its turn. |<|<|
| !Teleport|The solar magically teleports, along with any equipment it is wearing or carrying, up to <<range 120>> to an unoccupied space it can see. |<|
| !Searing Burst|''Costs 2 Actions''<br/>The solar emits magical, divine energy. Each creature of its choice in a <<sphere 10>> must make a <<save Dex 23>>, taking <<fire 4d6>> + <<radiant 4d6>> on a failed save, or <<halved>> on a successful one. |<|
| !Blinding Gaze|''Costs 3 Actions''<br/>The solar targets one creature it can see within <<range 30>> of it. If the target can see it, the target must succeed on a <<save Con 15>> or be [[Blinded]] until magic such as the [[Lesser Restoration]] spell removes the blindness. |<|
Beginning at 2nd level, you can use soothing music or oration to help revitalize your wounded allies during a short rest. If you or any friendly creatures who can hear your performance regain hit points at the end of the short rest by spending one or more Hit Dice, each of those creatures regains an extra 1d6 hit points.

The extra hit points increase when you reach certain levels in this class: to 1d8 at 9th level, to 1d10 at 13th level, and to 1d12 at 17th level.
{{Song of Rest}}
{{Song of Rest}}
{{Song of Rest}}
As a sorcerer, you gain the following class features.

!! Hit Points
"""
''Hit Dice:'' 1d6 per sorcerer level
''Hit Points at 1st Level:'' 6 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d6 (or 4) + your Constitution modifier per sorcerer level after 1st
"""

!! Proficiencies
"""
''Armor:'' None
''Weapons:'' Daggers, darts, slings, quarterstaffs, light crossbows
''Tools:'' None
''Saving Throws:'' Constitution, Charisma
''Skills:'' Choose two from Arcana, Deception, Insight, Intimidation, Persuasion, and Religion
"""

!! Equipment

You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a light crossbow and 20 bolts or (b) any simple weapon
(a) a component pouch or (b) an arcane focus
(a) a dungeoneer’s pack or (b) an explorer’s pack
Two daggers
"""

!! Subclasses

<<list-box "[tag[Sorcerer]tag[Subclass]sort[]]">>

<<include "Sorcerer Advancement Table">>

---

<<include "Sorcerer Ability">>
<<sections-vertical "[[Sorcerer Spellcasting]] [[Sorcerous Origin]] [[Font of Magic]] [[Metamagic]] [[Sorcerer Ability Score Improvement]] [[Sorcerous Versatility]] [[Magical Guidance]] [[Sorcerous Restoration]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.

---

<<include "Sorcerous Versatility">>
| !Level | !Proficiency Bonus | !Sorcery Points | !Features | !Cantrips Known | !Spells Known | !—Spell Slots per Spell Level— |<|<|<|<|<|<|<|<|
|~|~|~|~|~|~| !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 | — |[[Spellcasting|Sorcerer Spellcasting]], Sorcerous Origin | 4 | 2 | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 | 2 |[[Font of Magic]] | 4 | 3 | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 | 3 |[[Metamagic]] | 4 | 4 | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 | 4 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 5 | 5 | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 | 5 |[[Magical Guidance]] | 5 | 6 | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 | 6 |Sorcerous Origin Feature | 5 | 7 | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 | 7 | — | 5 | 8 | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 | 8 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 5 | 9 | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 | 9 | — | 5 | 10 | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 | 10 |[[Metamagic]] | 6 | 11 | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 | 11 | — | 6 | 12 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 | 12 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 12 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 | 13 | — | 6 | 13 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 | 14 |Sorcerous Origin Feature | 6 | 13 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 | 15 | — | 6 | 14 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 | 16 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 14 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 | 17 |[[Metamagic]] | 6 | 15 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 | 18 |Sorcerous Origin Feature | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 | 19 |[[Ability Score Improvement|Sorcerer Ability Score Improvement]] | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 | 20 |[[Sorcerous Restoration]] | 6 | 15 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |
<<spelltable "[[Acid Splash]] [[Blade Ward]] [[Booming Blade]] [[Chill Touch]] [[Control Flames]] [[Create Bonfire]] [[Dancing Lights]] [[Fire Bolt]] [[Friends]] [[Frostbite]] [[Green-Flame Blade]] [[Gust]] [[Infestation]] [[Light]] [[Lightning Lure]] [[Mage Hand]] [[Mending]] [[Message]] [[Mind Silver]] [[Minor Illusion]] [[Mold Earth]] [[Poison Spray]] [[Prestidigitation]] [[Ray of Frost]] [[Shape Water]] [[Shocking Grasp]] [[Sword Burst]] [[Thunderclap]] [[True Strike]] ">>
An event in your past, or in the life of a parent or ancestor, left an indelible mark on you, infusing you with arcane magic. This font of magic, whatever its origin, fuels your spells. See Spells Rules for the general rules of spellcasting and the Spells Listing for the sorcerer spell list.

!!! Cantrips

At 1st level, you know four cantrips of your choice from the sorcerer spell list. You learn additional sorcerer cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Sorcerer table.

!!! Spell Slots

The Sorcerer table shows how many spell slots you have to cast your sorcerer spells of 1st level and higher. To cast one of these sorcerer spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

For example, if you know the 1st-level spell burning hands and have a 1st-level and a 2nd-level spell slot available, you can cast burning hands using either slot.

!!! Spells Known of 1st Level and Higher

You know two 1st-level spells of your choice from the sorcerer spell list.

The Spells Known column of the Sorcerer table shows when you learn more sorcerer spells of your choice. Each of these spells must be of a level for which you have spell slots. For instance, when you reach 3rd level in this class, you can learn one new spell of 1st or 2nd level.

Additionally, when you gain a level in this class, you can choose one of the sorcerer spells you know and replace it with another spell from the sorcerer spell list, which also must be of a level for which you have spell slots.

!!! Spellcasting Ability

Charisma is your spellcasting ability for your sorcerer spells, since the power of your magic relies on your ability to project your will into the world. You use your Charisma whenever a spell refers to your spellcasting ability. In addition, you use your Charisma modifier when setting the saving throw DC for a sorcerer spell you cast and when making an attack roll with one.

''Spell save DC ='' 8 + your proficiency bonus + your Charisma modifier

''Spell attack modifier ='' your proficiency bonus + your Charisma modifier

!!! Spellcasting Focus

You can use an arcane focus (see the Adventuring Gear section) as a spellcasting focus for your sorcerer spells.
<<htabs "[tag[Sorcerer Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is3uAACtt8r9iqPdsbkZPquR6bV72H7LffG5Pcct3/e1vJ4PCOMXSPgyWIiocpjIWLLYCAnyGEmp4VdXmUlx+afpGcH5KQoaOmq6wNl5epq66hqQqvrqGTvL2mo7GiubG7nb+/kLrCk8TLnLa1yIrHxc3MzIDB2NnDxtV219LZe9vVztTdgdzpetTW5mfo7+pc6Obf4+5y7/Rl+/pr6OD3bPL6Zv3z8y+gaOCWgQYMGEWgIKZLjEIcQsDh9OPFLxYj/+iRqnVMTUkclHiyGBjCz5ZCRIlEZUkmSpwyVMJS5XzjRZ8ybGnDqJ1MzTE87Pl0ENDS2K8yhSOkNtLqXR1OnTGFGlTjVa9SqOqla1ruBK1GsIsF3FmiAb1mwHtGoFsW3rAm1ZuB7kzqXLwe5dvBn0puUrwS/gs37/Dm5Q2PBhVIUXj03sWFJixZFhTa6cd/JezAk0b+Z8wPNnzqJHYy5NGTBq045Xp6brmvXg2K/V0paN93Ztr7pxt+29+yrw4EuHEy9q/HjQ5MpvMm8+8zl0ltJBh5Y+PST27Bq3+0bunbT37zrHk3duvrJ5oK3Xcx/onv3s+O/x0Zef+379d/r+8f8ma1lj+YEVoGCwAWjAZXC9VaBeBxLYoIMLIqjZhBRWaNtbnv13oYJmyZUghmLZdZ2HWpEYoonCgZgiZLyh2KKBJ8IYoYQrsliigDfiWCOPxckYo40/AinikEIWiZSLQdIIno49+tiTiRsaeSSS5Uk55XIqZhnlllbCxOWTUFKHpGhaAohLjkpGp2EpajoJJoNuvgkkmRAGqcAhdaKE4Jt5srendneqyVgagXbUJ55/GnroRYPGyICejU7EVaErSSpkSZUumgymTAraVKTaLDIpRFmhAsEjpRq06QWTZNrdqa76B6ujslowiZg/2RkqBrl+amtUffmnK0+a3lr+AbHFysQnshPkumSvxwo7a6cMgiptstaMSamzgW17LaLerhVurNSKwK2p42aWqLgyQUtuu+ae1OAI6TLE05x1tXEuth8p+oGqSjVLb72SxZGtvxy1eHAdu8ZZMAKp6fswrxkRdonExhIcMboOVMzxvySMuvG0Ko38cckhiyzJAyBbzHLALqts8sktp8wsmy9vQLLNV9LsSM7oDXwC0DULHTTSOhvdcMw/Mx2w0ktL/RjVEFsdtc9NQj3szl1yrW3CW2MdtthnEl3tuk97TcqjVKLddqs7yq2svE+FWe5U/en74t77heP3ed32p5p+8913GOKLxadeeqeFJx521i1D69rkdN5mucbAZd5Zb5xzWvnnlpopOmKllZ6qiqjjfO/qorrt+iZwx77vM7Tfjnvuuu/Oe+++/w588MIPT3zxxtNQAAA7
Choose a sorcerous origin, which describes the source of your innate magical power: Draconic Bloodline, detailed at the end of the class description, or one from another source.

Your choice grants you features when you choose it at 1st level and again at 6th, 14th, and 18th level.
At 20th level, you regain 4 expended sorcery points whenever you finish a short rest.
"""
''Optional Class Feature''
"""

Whenever you reach a level in this class that grants the Ability Score Improvement feature, you can do one of the following, representing the magic within you flowing in new ways:

* Replace one of the options you chose for the Metamagic feature with a different Metamagic option available to you.
* Replace one cantrip you learned from this class’s Spellcasting feature with another cantrip from the sorcerer spell list.
<<list-icons "[tag[Sourcebook]sort[order]]" "0 sourcebooks found.">>
This viscous, milky-white substance can form a permanent adhesive bond between any two objects. It must be stored in a jar or flask that has been coated inside with [[Oil of Slipperiness]]. When found, a container contains <<roll 1d6+1>> ounces.

One ounce of the glue can cover a 1-foot square surface. The glue takes <<time 1m>> to set. Once it has done so, the bond it creates can be broken only by the application of [[Universal Solvent]] or [[Oil of Etherealness]], or with a [[Wish]] spell.
You touch a living creature that has 0 hit points. The creature becomes stable. This spell has no effect on undead or constructs.
You gain the ability to comprehend and verbally communicate with beasts for the duration.
The knowledge and awareness of many beasts is limited by their intelligence, but at minimum, beasts can give you information about nearby locations and monsters, including whatever they can perceive or have perceived within the past day. You might be able to persuade a beast to perform a small favor for you, at the DM’s discretion.
You grant the semblance of life and intelligence to a corpse of your choice within range, allowing it to answer the questions you pose. The corpse must still have a mouth and can’t be undead. The spell fails if the corpse was the target of this spell within the last 10 days.

Until the spell ends, you can ask the corpse up to five questions. The corpse knows only what it knew in life, including the languages it knew. Answers are usually brief, cryptic, or repetitive, and the corpse is under no compulsion to offer a truthful answer if you are hostile to it or it recognizes you as an enemy. This spell doesn’t return the creature’s soul to its body, only its animating spirit. Thus, the corpse can’t learn new information, doesn’t comprehend anything that has happened since it died, and can’t speculate about future events.
You imbue plants within 30 feet of you with limited sentience and animation, giving them the ability to communicate with you and follow your simple commands. You can question plants about events in the spell’s area within the past day, gaining information about creatures that have passed, weather, and other circumstances.

You can also turn difficult terrain caused by plant growth (such as thickets and undergrowth) into ordinary terrain that lasts for the duration. Or you can turn ordinary terrain where plants are present into difficult terrain that lasts for the duration, causing vines and branches to hinder pursuers, for example.

Plants might be able to perform other tasks on your behalf, at the DM’s discretion. The spell doesn’t enable plants to uproot themselves and move about, but they can freely move branches, tendrils, and stalks.

If a plant creature is in the area, you can communicate with it as if you shared a common language, but you gain no magical ability to influence it.

This spell can cause the plants created by the [[Entangle]] spell to release a [[Restrained]] creature.
"""
''Incorporeal Movement.'' The specter can move through other creatures and objects as if they were difficult terrain. It takes <<force 1d10>> if it ends its turn inside an object.
''Sunlight Sensitivity.'' While in sunlight, the specter has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
"""
<<fold "Poltergeist, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee "Life Drain" +4>>|<<necrotic 3d6>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 10>> or its hit point maximum is reduced by an amount equal to the damage taken. This reduction lasts until the creature finishes a long rest. The target dies if this effect reduces its hit point maximum to 0. |<|
A spell is a discrete magical effect, a single shaping of the magical energies that suffuse the multiverse into a specific, limited expression. In casting a spell, a character carefully plucks at the invisible strands of raw magic suffusing the world, pins them in place in a particular pattern, sets them vibrating in a specific way, and then releases them to unleash the desired effect — in most cases, all in the span of seconds.

Spells can be versatile tools, weapons, or protective wards. They can deal damage or undo it, impose or remove conditions, drain life energy away, and restore life to the dead.

Uncounted thousands of spells have been created over the course of the multiverse's history, and many of them are long forgotten. Some might yet lie recorded in crumbling spellbooks hidden in ancient ruins or trapped in the minds of dead gods. Or they might someday be reinvented by a character who has amassed enough power and wisdom to do so.

* [[Spells By Level]]
* [[Spells By Class]]
* [[Concentration Spells]]
* [[Ritual Spells]]
* [[Attack Cantrips]]
\define spell(name)
!! [[$name$]]
"""
<hr/>//{{$name$!!classes}}// <span style="float:right">//Source: {{$name$!!source}}//</span><hr/>//Level {{$name$!!level}} {{$name$!!school}}//

''Casting Time'': {{$name$!!casting_time}}
''Range'': {{$name$!!range}}
''Components'': {{$name$!!components}}
''Duration'': <$list filter="[all[{$name$]get[concentration]] -No">Concentration, </$list> {{$name$!!duration}}
"""

{{$name$!!text}}

<$list filter="[all[$name$]get[at_higher_level]]" variable="">
''At Higher Levels'': {{$name$!!at_higher_level}}
</$list>
\end


\define spelltable(spells)
<table class="max spelltable">
<tr>
<th align="left">Spell</th>
<th align="center">Level</th>
<th align="center">School</th>
<th align="center">Casting Time</th>
<th align="center">V/S/M</th>
<th align="center">Range/Area</th>
<th align="center">Duration</th>
<th align="center">Meta</th>
</tr>
<$list filter="$spells$" template=SpellTableRowTemplate />
</table>
\end

\define spells(spells, dc:"DC", to-hit:"to-hit")
<table class="max">
<tr>
<th align="center">Cast</th>
<th align="center" colspan="3">Spell</th>
<th align="center" rowspan="2">Effect</th>
</tr>
<tr>
<th align="center">VSM</th>
<th align="right"><<range>></th>
<th align="center"><<target>></th>
<th align="left"><<time>></th>
</tr>
<$set name=dc value="$dc$"><$set name=to-hit value="$to-hit$"><$list filter="$spells$" template=SpellSummaryRowTemplate /></$set></$set>
</table>
\end

"""
&lt;&lt;''spell'' //spellname//&gt;&gt; - Displays a single spell
&lt;&lt;''spelltable'' //spell1 spell2 ...//&gt;&gt; - Displays a table of spells
&lt;&lt;''spells'' //spells dc to-hit//&gt;&gt; - Displays a table of spells
"""

| !Spell Templates |
|SpellUpperViewTemplate |
|SpellLowerViewTemplate |
|SpellEditTemplate |
|SpellTableRowTemplate |
|SpellSummaryRowTemplate |
At 18th level, you have achieved such mastery over certain spells that you can cast them at will. Choose a 1st-level wizard spell and a 2nd-level wizard spell that are in your spellbook. You can cast those spells at their lowest level without expending a spell slot when you have them prepared. If you want to cast either spell at a higher level, you must expend a spell slot as normal.

By spending 8 hours in study, you can exchange one or both of the spells you chose for different spells of the same levels.
A spell scroll bears the words of a single spell, written in a mystical cipher. If the spell is on your class's spell list, you can use an action to read the scroll and cast its spell without having to provide any of the spell's components. Otherwise, the scroll is unintelligible.

If the spell is on your class's spell list but of a higher level than you can normally cast, you must make an ability check using your spellcasting ability to determine whether you cast it successfully. The DC equals 10 + spell's level. On a failed check, the spell disappears from the scroll with no other effect.

Once the spell is cast, the words on the scroll fade, and the scroll itself crumbles to dust.

The level of the spell on the scroll determines the spell's saving throw DC and attack bonus, as well as the scroll's rarity, as shown in the Spell Scroll Table.

<<fold "Spell Scroll Table">>

A wizard spell on a spell scroll can be copied just as spells in spellbooks can be copied. When a spell is copied from a spell scroll, the copier must succeed on <<arcana "10+Spell_Level">>. If the check succeeds, the spell is successfully copied. Whether the check succeeds or fails, the spell scroll is destroyed.

<<fold "Spell Scroll Mishap">>
A creature who tries and fails to cast a spell from a spell scroll must make a <<save Int 10>>. If the saving throw fails, roll on the Scroll Mishap table.

|max top|k
| !d6 | !Result |
| !1 |A surge of magical energy deals the caster 1d6 force damage per level of the spell. |
| !2 |The spell affects the caster or an ally (determined randomly) instead of the intended target, or it affects a random target nearby if the caster was the intended target. |
| !3 |The spell affects a random location within the spell’s range. |
| !4 |The spell’s effect is contrary to its normal one, but neither harmful nor beneficial. For instance, a fireball might produce an area of harmless cold. |
| !5 |The caster suffers a minor but bizarre effect related to the spell. Such effects last only as long as the original spell’s duration, or 1d10 minutes for spells that take effect instantaneously. For example, a fireball might cause smoke to billow from the caster’s ears for 1d10 minutes. |
| !6 |The spell activates after 1d12 hours. If the caster was the intended target, the spell takes effect normally. If the caster was not the intended target, the spell goes off in the general direction of the intended target, up to the spell’s maximum range, if the target has moved away. |
| !Spell Level | !Rarity | !Save DC | !Attack Bonus |
| !Cantrip | !Common | 13 | +5 |
| !1st | !Common | 13 | +5 |
| !2nd | !Uncommon | 13 | +5 |
| !3rd | !Uncommon | 15 | +7 |
| !4th | !Rare | 15 | +7 |
| !5th | !Rare | 17 | +9 |
| !6th | !Very Rare | 17 | +9 |
| !7th | !Very Rare | 18 | +10 |
| !8th | !Very Rare | 18 | +10 |
| !9th | !Legendary | 19 | +11 |
These are tools to help with casting of spells, such as selecting creatures to be summoned.

<<vtabs "[tag[Spell Tool]sort[]]">>
<<fold "About Spellbooks">>

<<vtabs "[tag[Spellbook]sort[]]">>
<<vtabs "[tag[Spellbook]sort[title]]">>
<$list filter="[all[current]tag[Spell]]">

|!''Spell Level'' |<$edit-text field=level/>|!''Classes'' |<$edit-text field=classes/>|
|!''Spell School'' |<$edit-text field=school/>|!''Source'' |<$edit-text field=source/>|
|!''Casting Time'' |<$edit-text field=casting_time/>|!''Concentration?'' |<$edit-text field=concentration/>|
|!''Range'' |<$edit-text field=range/>|!''Ritual?'' |<$edit-text field=ritual/>|
|!''Components'' |<$edit-text field=components/>|<|<|
|!''Material'' |<$edit-text size=70 field=material/>|<|<|
|!''Duration'' |<$edit-text field=duration/>|<|<|
|!''At Higher Levels'' |<$edit-text size=70 field=at_higher_level/>|<|<|
| !Glyph |<|<|<|
|!''Casting Time'' |<$edit-text field=glyph_casting_time/>|<|<|
|!''Range'' |<$edit-text field=glyph_range/>|<|<|
|!''Target'' |<$edit-text field=glyph_target/>|<|<|
|!''Duration'' |<$edit-text field=glyph_duration/>|<|<|
|!''Summary'' |<$edit-text field=glyph_effect size=70/>|<|<|
</$list>
While holding this shield, you have advantage on saving throws against spells and other magical effects, and spell attacks have disadvantage against you.
<$list filter="[all[current]tag[Spell]]">
<$reveal type="nomatch" state="!!at_higher_level" text="">''At Higher Levels'': {{!!at_higher_level}}<br/></$reveal>
''Summary'': <$set name=dc value=DC><$set name=to-hit value=to-hit>{{!!glyph_casting_time}} | {{!!glyph_range}} | {{!!glyph_target}} | {{!!glyph_duration}} | {{!!glyph_effect}}</$set></$set>
</$list>
<div class="tc-table-of-contents">

<<toc-selective-expandable "Spell Encyclopedia"  "sort[title]">>

</div>
<<vtabs "[tag[Spells By Class]]">>
<<htabs "[tag[Spells By Level]sort[order]]">>
<<vtabs "[tag[Spells By Sourcebook]]">>
1: 2
2: 3
3: 4
4: 4
5: 4
6: 4
7: 4
8: 4
9: 4
10: 4
11: 4
12: 4
13: 4
14: 4
15: 4
16: 4
17: 4
18: 4
19: 4
20: 4
1: 0
2: 0
3: 2
4: 3
5: 3
6: 3
7: 3
8: 3
9: 3
10: 3
11: 3
12: 3
13: 3
14: 3
15: 3
16: 3
17: 3
18: 3
19: 3
20: 3
1: 0
2: 0
3: 0
4: 0
5: 2
6: 3
7: 3
8: 3
9: 3
10: 3
11: 3
12: 3
13: 3
14: 3
15: 3
16: 3
17: 3
18: 3
19: 3
20: 3
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 1
8: 2
9: 3
10: 3
11: 3
12: 3
13: 3
14: 3
15: 3
16: 3
17: 3
18: 3
19: 3
20: 3
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 1
10: 2
11: 2
12: 2
13: 2
14: 2
15: 2
16: 2
17: 2
18: 3
19: 3
20: 3
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 0
10: 0
11: 1
12: 1
13: 1
14: 1
15: 1
16: 1
17: 1
18: 1
19: 2
20: 2
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 0
10: 0
11: 0
12: 0
13: 1
14: 1
15: 1
16: 1
17: 1
18: 1
19: 1
20: 2
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 0
10: 0
11: 0
12: 0
13: 0
14: 0
15: 1
16: 1
17: 1
18: 1
19: 1
20: 1
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 0
10: 0
11: 0
12: 0
13: 0
14: 0
15: 0
16: 0
17: 1
18: 1
19: 1
20: 1
<tr>
<th valign="top" align="center" style="width: 80px;">{{!!glyph_casting_time}}<$reveal type="match" state="!!concentration" text="Yes"><<concentration>></$reveal><$reveal type="match" state="!!ritual" text="Yes"><<ritual>></$reveal><$reveal type="nomatch" state="!!at_higher_level" text=""><<upcast>></$reveal></th>
<th valign="top" align="left" colspan="3" style="width: 200px;"><$link to={{!!title}}><$view field="title"/></$link><span style="float: right; font-weight: normal; font-style: italic;"><$reveal type="match" state="!!level" text="0">cantrip</$reveal><$reveal type="match" state="!!level" text="1">1st</$reveal><$reveal type="match" state="!!level" text="2">2nd</$reveal><$reveal type="match" state="!!level" text="3">3rd</$reveal><$reveal type="match" state="!!level" text="4">4th</$reveal><$reveal type="match" state="!!level" text="5">5th</$reveal><$reveal type="match" state="!!level" text="6">6th</$reveal><$reveal type="match" state="!!level" text="7">7th</$reveal><$reveal type="match" state="!!level" text="8">8th</$reveal><$reveal type="match" state="!!level" text="9">9th</$reveal></span></th>
<td valign="top" align="left" rowspan="2" style="width: 75%;">{{!!glyph_effect}} </td>
</tr>
<tr>
<td valign="top" align="center"><span style="font-size: smaller; font-style: italic;" title={{!!material}}>{{!!components}}</span></td>
<td valign="top" align="left" colspan="3"><span style="display: inline-block; width: 60px; text-align: right;">{{!!glyph_range}}</span> <span style="color: lightgray;">|</span> <span style="display: inline-block; min-width: 40px; text-align: center;">{{!!glyph_target}}</span> <span style="color: lightgray;">|</span> <span style="display: inline-block;">{{!!glyph_duration}}</span></td>
</tr>
<tr>
<th valign="top" align="left"><$link to={{!!title}}><$view field="title"/></$link></th>
<td valign="top" align="center">{{!!level}}</td>
<td valign="top" align="center">{{!!school}}</td>
<td valign="top" align="center">{{!!casting_time}}</td>
<td valign="top" align="center">{{!!components}}</td>
<td valign="top" align="center">{{!!range}}</td>
<td valign="top" align="center">{{!!duration}}</td>
<td valign="top" align="left">
<$list filter="[all[current]has[at_higher_level]]"><<upcast>></$list>
<$list filter="[all[current]field:concentration[Yes]]"><<concentration>></$list>
<$list filter="[all[current]field:ritual[Yes]]"><<ritual>></$list>
</td>
</tr>
<$list filter="[all[current]tag[Spell]]">

"""
<hr/>//{{!!classes}}// <span style="float:right">//Source: {{!!source}}//</span><hr/>//Level {{!!level}} {{!!school}}//

''Casting Time'': {{!!casting_time}}
''Range'': {{!!range}}
''Components'': {{!!components}} {{!!material}}
''Duration'': <$reveal type="nomatch" state="!!concentration" text="No">Concentration, </$reveal> {{!!duration}}
"""
</$list>
This 2-foot-diameter black sphere is a hole in the multiverse, hovering in space and stabilized by a magical field surrounding it.

The sphere obliterates all matter it passes through and all matter that passes through it. Artifacts are the exception. Unless an artifact is susceptible to damage from a sphere of annihilation, it passes through the sphere unscathed. Anything else that touches the sphere but isn’t wholly engulfed and obliterated by it takes <<force 4d10>>.

The sphere is stationary until someone controls it. If you are within 60 feet of an uncontrolled sphere, you can use an action to make a <<arcana 25>>. On a success, the sphere levitates in one direction of your choice, up to a number of feet equal to 5 × your Intelligence modifier (minimum 5 feet). On a failure, the sphere moves 10 feet toward you. A creature whose space the sphere enters must succeed on a <<save Dex 13>> or be touched by it, taking <<force 4d10>>.

If you attempt to control a sphere that is under another creature’s control, you make an Intelligence (Arcana) check contested by the other creature’s Intelligence (Arcana) check. The winner of the contest gains control of the sphere and can levitate it as normal.

If the sphere comes into contact with a planar portal, such as that created by the gate spell, or an extradimensional space, such as that within a portable hole, the DM determines randomly what happens, using the following table.

|max top|k
| !d100 | !Result |
| !01–50 |The sphere is destroyed. |
| !51–85 |The sphere moves through the portal or into the extradimensional space. |
| !86–00 |A spatial rift sends each creature and object within 180 feet of the sphere, including the sphere, to a random plane of existence. |
"""
''Spider Climb.'' The spider can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Web Sense.'' While in contact with a web, the spider knows the exact location of any other creature in contact with the same web.
''Web Walker.'' The spider ignores movement restrictions caused by webbing.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>>|<<piercing 1>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 9>> or take <<poison 1d4>>. |<|
Until the spell ends, one willing creature you touch gains the ability to move up, down, and across vertical surfaces and upside down along ceilings, while leaving its hands free. The target also gains a climbing speed equal to its walking speed.
The ground in a 20-foot radius centered on a point within range twists and sprouts hard spikes and thorns. The area becomes difficult terrain for the duration. When a creature moves into or within the area, it takes 2d4 piercing damage for every 5 feet it travels.

The transformation of the ground is camouflaged to look natural. Any creature that can’t see the area at the time the spell is case must make a Wisdom (Perception) check against your spell save DC to recognize the terrain as hazardous before entering it.
"""
''Mechanical Trap''
"""
This pit trap is a [[simple|Simple Pit]], [[hidden|Hidden Pit]], or [[locking pit|Locking Pit]] trap with sharpened wooden or iron spikes at the bottom. 

* ''Falling into the pit.''
** Creature takes <<piercing 2d10>>
* ''Poisoned Spikes.''
** Target makes <<save Con 13>>, taking <fail><<poison 4d10>></fail>, or <pass><<halved>></pass>
You call forth spirits to protect you.
They flit around you to a distance of 15 feet for the duration. If you are good or neutral, their spectral form appears angelic or fey (your choice). If you are evil, they appear fiendish.

When you cast this spell, you can designate any number of creatures you can see to be unaffected by it. An affected creature’s speed is halved in the area, and when the creature enters the area for the first time on a turn or starts its turn there, it must make a Wisdom saving throw. On a failed save, the creature takes 3d8 radiant damage (if you are good or neutral) or 3d8 necrotic damage (if you are evil). On a successful save, the creature takes half as much damage.
"""
''Rejuvenation.'' If it dies, the naga returns to life in <<time "1d6 days">> and regains all its hit points. Only a [[Wish]] spell can prevent this trait from functioning.
''Spellcasting.'' The naga is a 10th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 14>>, <<casted +6>>), and it needs only verbal components to cast its spells. It has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Mage Hand]], [[Minor Illusion]], [[Ray of Frost]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Charm Person]], [[Detect Magic]], [[Sleep]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Detect Thoughts]], [[Hold Person]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Lightning Bolt]], [[Water Breathing]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Blight]], [[Dimension Door]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (2 slots):'' [[Dominate Person]]
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 1d6+4>> |<<reach 10>> |
|~|Target must make a <<save Con 13>>, taking <fail><<poison 7d8>></fail>, <pass><<halved>></pass>. |<|
You create a floating, spectral weapon within range that lasts for the duration or until you cast this spell again.
When you cast the spell, you can make a melee spell attack against a creature within 5 feet of the weapon. On a hit, the target takes force damage equal to 1d8 + your spellcasting ability modifier.

As a bonus action on your turn, you can move the weapon up to 20 feet and repeat the attack against a creature within 5 feet of it.

The weapon can take whatever form you choose. Clerics of deities who are associated with a particular weapon (as St. Cuthbert is known for his mace and Thor for his hammer) make this spell’s effect resemble that weapon.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +2>>|<<slashing 1>> |<<reach 5>> |
|^ !<<ranged Shortbow +6>>|<<piercing 1>> |<<range 40/160>> |
|~|The target must succeed on a <<save Con 10>> or become [[Poisoned]] for <<time 1m>>. If its saving throw result is 5 or lower, the [[Poisoned]] target falls [[Unconscious]] for the same duration, or until it takes damage or another creature takes an action to shake it awake. |<|
|^ !Heart Sight|The sprite touches a creature and magically knows the creature's current emotional state. If the target fails a <<save Cha 10>>, the sprite also knows the creature's alignment. Celestials, fiends, and undead automatically fail the saving throw. |<|
|^ !Invisibility|The sprite magically turns [[Invisible]] until it attacks or casts a spell, or until its concentration ends (as if concentrating on a spell). Any equipment the sprite wears or carries is invisible with it. |<|
"""
''Cunning Action.'' On each of its turns, the spy can use a bonus action to take the Dash, Disengage, or Hide action.
''Sneak Attack (1/Turn).'' The spy deals an extra <<damage 2d6>> when it hits a target with a weapon attack and has advantage on the attack roll , or when the target is within 5 feet of an ally of the spy that isn't [[Incapacitated]] and the spy doesn't have disadvantage on the attack roll.
"""
[img[divider.png]]
''Multiattack.'' The spy makes two melee attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Shortsword +4>>|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged "Hand Crossbow" +4>>|<<piercing 1d6+2>> |<<range 30/120>> |
!! Races

<div class="shadow-box"><$list filter="[tag[Race]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!!! Subraces

<div class="shadow-box"><$list filter="[tag[Subrace]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!! Classes

<div class="shadow-box"><$list filter="[tag[Class]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!!! Subclasses

<div class="shadow-box"><$list filter="[tag[Subclass]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!! Feats

<div class="shadow-box"><$list filter="[tag[Feat]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!!Backgrounds

<div class="shadow-box"><$list filter="[tag[Background]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>

!! Spells

<div class="shadow-box"><$list filter="[tag[Spell]tag[SRD]sort[]]"><span style="width:200px; display: inline-block;">{{||Link}}</span></$list></div>
<<htabs "[tag[SRD Spell]sort[order]]">>
<<spelltable "[tag[Spell]tag[SRD]level[1]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[2]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[3]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[4]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[5]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[6]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[7]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[8]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[9]sort[]]">>
<<spelltable "[tag[Spell]tag[SRD]level[0]sort[]]">>
While holding this staff, you can use an action to expend 1 of its 10 charges to cast [[Charm Person]], [[Command]], or [[Comprehend Languages]] from it using your spell save DC. The staff can also be used as a magic quarterstaff.

If you are holding the staff and fail a saving throw against an enchantment spell that targets only you, you can turn your failed save into a successful one. You can’t use this property of the staff again until the next dawn. If you succeed on a save against an enchantment spell that targets only you, with or without the staff’s intervention, you can use your reaction to expend 1 charge from the staff and turn the spell back on its caster as if you had cast the spell.

The staff regains <<roll 1d8+2>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff becomes a nonmagical quarterstaff.
You have resistance to <<fire fire>> damage while you hold this staff.

The staff has 10 charges. While holding it, you can use an action to expend 1 or more of its charges to cast one of the following spells from it, using your spell save DC: [[Burning Hands]] (1 charge), [[Fireball]] (3 charges), or [[Wall of Fire]] (4 charges).

The staff regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff blackens, crumbles into cinders, and is destroyed.
You have resistance to <<cold cold>> damage while you hold this staff.

The staff has 10 charges. While holding it, you can use an action to expend 1 or more of its charges to cast one of the following spells from it, using your spell save DC: [[Cone of Cold]] (5 charges), [[Fog Cloud]] (1 charge), [[Ice Storm]] (4 charges), or [[Wall of Ice]] (4 charges).

The staff regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff turns to water and is destroyed.
This staff has 10 charges. While holding it, you can use an action to expend 1 or more of its charges to cast one of the following spells from it, using your spell save DC and spellcasting ability modifier: [[Cure Wounds]] (1 charge per spell level, up to 4th), [[Lesser Restoration]] (2 charges), or [[Mass Cure Wounds]] (5 charges).

The staff regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff vanishes in a flash of light, lost forever.
This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it. While holding it, you gain a +2 bonus to Armor Class, saving throws, and spell attack rolls.

The staff has 20 charges for the following properties. The staff regains <<roll 2d8+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff retains its +2 bonus to attack and damage rolls but loses all other properties. On a 20, the staff regains <<roll 1d8+2>> charges.

''Power Strike.'' When you hit with a melee attack using the staff, you can expend 1 charge to deal an extra <<force 1d6>> to the target.

''Spells.'' While holding this staff, you can use an action to expend 1 or more of its charges to cast one of the following spells from it, using your spell save DC and spell attack bonus: [[Cone of Cold]] (5 charges), [[Fireball]] (5th-level version, 5 charges), [[Globe of Invulnerability]] (6 charges), [[Hold Monster]] (5 charges), [[Levitate]] (2 charges), [[Lightning Bolt]] (5th-level version, 5 charges), [[Magic Missile]] (1 charge), [[Ray of Enfeeblement]] (1 charge), or [[Wall of Force]] (5 charges).

''Retributive Strike.'' You can use an action to break the staff over your knee or against a solid surface, performing a retributive strike. The staff is destroyed and releases its remaining magic in an explosion that expands to fill a <<sphere 30>>.

You have a 50 percent chance to instantly travel to a random plane of existence, avoiding the explosion. If you fail to avoid the effect, you take force damage equal to 16 × the number of charges in the staff. Every other creature in the area must make a <<save Dex 17>>. On a failed save, a creature takes an amount of damage based on how far away it is from the point of origin, as shown in the following table. On a successful save, a creature takes half as much damage.

| !Distance from Origin | !Damage |
|!10 ft. away or closer |8 × the number of charges in the staff |
|!11 to 20 ft. away |6 × the number of charges in the staff |
|!21 to 30 ft. away |4 × the number of charges in the staff |
This staff can be wielded as a magic quarterstaff that grants a +3 bonus to attack and damage rolls made with it.

The staff has 10 charges. When you hit with a melee attack using it, you can expend up to 3 of its charges. For each charge you expend, the target takes an extra <<force 1d6>>. The staff regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, the staff becomes a nonmagical quarterstaff.
This staff has 10 charges and regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 1, a swarm of insects consumes and destroys the staff, then disperses.

''Spells.'' While holding the staff, you can use an action to expend some of its charges to cast one of the following spells from it, using your spell save DC: [[Giant Insect]] (4 charges) or [[Insect Plague]] (5 charges).

''Insect Cloud.'' While holding the staff, you can use an action and expend 1 charge to cause a swarm of harmless flying insects to spread out in a 30-foot radius from you. The insects remain for <<time 10m>>, making the area [[Heavily Obscured]] for creatures other than you. The swarm moves with you, remaining centered on you. A wind of at least 10 miles per hour disperses the swarm and ends the effect.
This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it. While you hold it, you gain a +2 bonus to spell attack rolls.

The staff has 50 charges for the following properties. It regains <<roll 4d6+2>> expended charges daily at dawn. If you expend the last charge, roll a <<roll d20>>. On a 20, the staff regains <<roll 1d12+1>> charges.

''Spell Absorption.'' While holding the staff, you have advantage on saving throws against spells. In addition, you can use your reaction when another creature casts a spell that targets only you. If you do, the staff absorbs the magic of the spell, canceling its effect and gaining a number of charges equal to the absorbed spell’s level. However, if doing so brings the staff’s total number of charges above 50, the staff explodes as if you activated its retributive strike (see below).

''Spells.'' While holding the staff, you can use an action to expend some of its charges to cast one of the following spells from it, using your spell save DC and spellcasting ability: [[Conjure Elemental]] (7 charges), [[Dispel Magic]] (3 charges), [[Fireball]] (7th-level version, 7 charges), [[Flaming Sphere]] (2 charges), [[Ice Storm]] (4 charges), [[Invisibility]] (2 charges), [[Knock]] (2 charges), [[Lightning Bolt]] (7th-level version, 7 charges), [[Passwall]] (5 charges), [[Plane Shift]] (7 charges), [[Telekinesis]] (5 charges), [[Wall of Fire]] (4 charges), or [[Web]] (2 charges).

You can also use an action to cast one of the following spells from the staff without using any charges: [[Arcane Lock]], [[Detect Magic]], [[Enlarge/Reduce]], [[Light]], [[Mage Hand]], or [[Protection from Evil and Good]].

''Retributive Strike.'' You can use an action to break the staff over your knee or against a solid surface, performing a retributive strike. The staff is destroyed and releases its remaining magic in an explosion that expands to fill a <<sphere 30>>.

You have a 50 percent chance to instantly travel to a random plane of existence, avoiding the explosion. If you fail to avoid the effect, you take force damage equal to 16 × the number of charges in the staff. Every other creature in the area must make a <<save Dex 17>>. On a failed save, a creature takes an amount of damage based on how far away it is from the point of origin, as shown in the following table. On a successful save, a creature takes half as much damage.

| !Distance from Origin | !Damage |
|!10 ft. away or closer |8 × the number of charges in the staff |
|!11 to 20 ft. away |6 × the number of charges in the staff |
|!21 to 30 ft. away |4 × the number of charges in the staff |
You can use an action to speak this staff’s command word and throw the staff on the ground within 10 feet of you. The staff becomes a <<mob "Giant Constrictor Snake">> (see the Monster Manual for statistics) under your control and acts on its own initiative count. By using a bonus action to speak the command word again, you return the staff to its normal form in a space formerly occupied by the snake.

On your turn, you can mentally command the snake if it is within 60 feet of you and you aren’t [[Incapacitated]]. You decide what action the snake takes and where it moves during its next turn, or you can issue it a general command, such as to attack your enemies or guard a location.

If the snake is reduced to <<hp 0>>, it dies and reverts to its staff form. The staff then shatters and is destroyed. If the snake reverts to staff form before losing all its hit points, it regains all of them.
This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it. While holding it, you have a +2 bonus to spell attack rolls.

The staff has 10 charges for the following properties. It regains <<roll 1d6+4>> expended charges daily at dawn. If you expend the last charge, roll a <<d20>>. On a 1, the staff loses its properties and becomes a nonmagical quarterstaff.

''Spells.'' You can use an action to expend 1 or more of the staff’s charges to cast one of the following spells from it, using your spell save DC: [[Animal Friendship]] (1 charge), [[Awaken]] (5 charges), [[Barkskin]] (2 charges), [[Locate Animals or Plants]] (2 charges), [[Speak with Animals]] (1 charge), [Speak with Plants]] (3 charges), or [[Wall of Thorns]] (6 charges).

You can also use an action to cast the [[Pass Without Trace]] spell from the staff without using any charges.

''Tree Form.'' You can use an action to plant one end of the staff in fertile earth and expend 1 charge to transform the staff into a healthy tree. The tree is 60 feet tall and has a 5-foot-diameter trunk, and its branches at the top spread out in a 20-foot radius. The tree appears ordinary but radiates a faint aura of transmutation magic if targeted by detect magic. While touching the tree and using another action to speak its command word, you return the staff to its normal form. Any creature in the tree falls when it reverts to a staff.
This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it. It also has the following additional properties. When one of these properties is used, it can’t be used again until the next dawn.

''Lightning.'' When you hit with a melee attack using the staff, you can cause the target to take an extra <<lightning 2d6>>.

''Thunder.'' When you hit with a melee attack using the staff, you can cause the staff to emit a crack of thunder, audible out to 300 feet. The target you hit must succeed on a <<save Con 17>> or become [[Stunned]] until the end of your next turn.

''Lightning Strike.'' You can use an action to cause a bolt of lightning to leap from the staff’s tip in a line that is 5 feet wide and <<line 120>>. Each creature in that line must make a <<save Dex 17>>: <fail><<lightning 9d6>></fail> <pass><<halved>></pass>.

''Thunderclap.'' You can use an action to cause the staff to issue a deafening thunderclap, audible out to 600 feet. Each creature within 60 feet of you (not including you) must make a <<save Con 17>>: <fail><<thunder 2d6>> + [[Deafened]] for <<time 1m>></fail> <pass><<halved>></pass>.

''Thunder and Lightning.'' You can use an action to use the Lightning Strike and Thunderclap properties at the same time. Doing so doesn’t expend the daily use of those properties, only the use of this one.
This staff has 3 charges and regains <<roll 1d3>> expended charges daily at dawn.

The staff can be wielded as a magic quarterstaff. On a hit, it deals damage as a normal quarterstaff, and you can expend 1 charge to deal an extra <<necrotic 2d10>> to the target. In addition, the target must succeed on a <<save Con 15>> or have disadvantage for <<time 1h>> on any ability check or saving throw that uses Strength or Constitution.
When a hostile creature misses you with a melee attack, you can use your reaction to force that creature to repeat the same attack against another creature (other than itself) of your choice.
| !Coin | !CP | !SP | !EP | !GP | !PP |
| !Copper (cp) | 1 | 1/10 | 1/50 | 1/100 | 1/1,000 |
| !Silver (sp) | 10 | 1 | 1/5 | 1/10 | 1/100 |
| !Electrum (ep) | 50 | 5 | 1 | 1/2 | 1/20 |
| !Gold (gp) | 100 | 10 | 2 | 1 | 1/10 |
| !Platinum (pp) | 1,000 | 100 | 20 | 10 | 1 |
"""
''Optional Class Feature''
"""

As a bonus action, you give yourself advantage on your next attack roll on the current turn. You can use this bonus action only if you haven’t moved during this turn, and after you use the bonus action, your speed is 0 until the end of the current turn.
"""
''Death Burst.'' When the mephit dies, it explodes in a cloud of steam. Each creature within <<range 5>> of the mephit must succeed on a <<save Dex 10>> or take <<fire 1d8>>.
''Innate Spellcasting (1/Day).'' The mephit can innately cast [[Blur]], requiring no material components. Its innate spellcasting ability is Charisma.
"""

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +2>>|<<slashing 1d4>> + <<fire 1d4>> |<<reach 5>> |
| !Steam Breath|''Recharge 6.''<br/>The mephit exhales a <<cone 15>> of scalding steam. Each creature in that area must succeed on a <<save Dex 10>>, taking <fail><<fire 1d8>></fail>, or <pass><<halved>></pass>. |<|
You have advantage on saving throws against being frightened.
You can spend 1 [[Ki]] point to take the Disengage or Dash action as a bonus action on your turn, and your jump distance is doubled for the turn.
Starting at 7th level, you can use your action to end one effect on yourself that is causing you to be charmed or frightened.
You create a 20-foot-radius sphere of yellow, nauseating gas centered on a point within range. The cloud spreads around corners, and its area is [[Heavily Obscured]]. The cloud lingers in the air for the duration.

Each creature that is completely within the cloud at the start of its turn must make a Constitution saving throw against poison. On a failed save, the creature spends its action that turn retching and reeling. Creatures that don’t need to breathe or are immune to poison automatically succeed on this saving throw.

A moderate wind (at least 10 miles per hour) disperses the cloud after 4 rounds. A strong wind (at least 20 miles per hour) disperses it after 1 round.
|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Blood Drain" +5>>|<<piercing 1d4+3>> |<<reach 5>> |
|~|The stirge attaches to the target. While attached, the stirge doesn’t attack. Instead, at the start of each of the stirge’s turns, the target loses <<damage 1d4+3>> due to blood loss.<br/>&nbsp;<br/>The stirge can detach itself by spending 5 feet of its movement. It does so after it drains <<hp 10>> of blood from the target or the target dies. A creature, including the target, can use its action to detach the stirge. |<|
"""
''Stone Camouflage.'' The giant has advantage on Dexterity (Stealth) checks made to hide in rocky terrain.
"""
<<divider>>
''Multiattack.'' The giant makes two greatclub attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatclub +9>>|<<bludgeoning 3d8+6>> |<<reach 15>> |
| !<<ranged Rock +9>>|<<bludgeoning 4d10+6>> |<<range 60/240>> |
|~|If the target is a creature, it must succeed on a <<save Str 17>> or be knocked [[Prone]]. |<|
| !<<reaction>> Reactions |<|<|
|!Rock Catching |If a rock or similar object is hurled at the giant, the giant can, with a successful <<save Dex 10>>, catch the missile and take no bludgeoning damage from it. |<|
"""
''Immutable Form.'' The golem is immune to any spell or effect that would alter its form.
''Magic Resistance.'' The golem has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The golem’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The golem makes two slam attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +10>>|<<bludgeoning 3d8+6>> |<<reach 5>> |
| !Slow|''Recharge 5–6''<br/>The golem targets one or more creatures it can see within <<range 10>>. Each target must make a <<save Wis 17>> against this magic. On a failed save, a target can’t use <<reaction>>, its speed is halved, and it can’t make more than one attack on its turn. In addition, the target can take either an <<action>> or a <<ba>> on its turn, not both. These effects last for 1 minute. A target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |<|
If the stone is touching the ground, you can use an action to speak its command word and summon an <<mob "Earth Elemental">>, as if you had cast the [[Conjure Elemental]] spell. The stone can’t be used this way again until the next dawn. The stone weighs 5 pounds.
While this polished agate is on your person, you gain a + 1 bonus to ability checks and saving throws.
You touch a stone object of Medium size or smaller or a section of stone no more than 5 feet in any dimension and form it into any shape that suits your purpose. So, for example, you could shape a large rock into a weapon, idol, or coffer, or make a small passage through a wall, as long as the wall is less than 5 feet thick. You could also shape a stone door or its frame to seal the door shut. The object you create can have up to two hinges and a latch, but finer mechanical detail isn’t possible.
Whenever you make an Intelligence (History) check related to the origin of stonework, you are considered proficient in the History skill and add double your proficiency bonus to the check, instead of your normal proficiency bonus.
This spell turns the flesh of a willing creature you touch as hard as stone. Until the spell ends, the target has resistance to nonmagical bludgeoning, piercing, and slashing damage.
"""
''Amphibious.'' The giant can breathe air and water.
''Innate Spellcasting.'' The giant’s innate spellcasting ability is Charisma (<<save "Spell DC" 17>>). It can innately cast the following spells, requiring no material components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Magic]], [[Feather Fall]], [[Levitate]], [[Light]]
&nbsp;&nbsp;&nbsp;&nbsp;''3/day each:'' [[Control Weather]], [[Water Breathing]]
"""
<<divider>>
''Multiattack.'' The giant makes two greatsword attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +14>>|<<slashing 6d6+9>> |<<reach 10>> |
| !<<ranged Rock +14>>|<<bludgeoning 4d12+9>> |<<range 60/240>> |
| !Lightning Strike|''Recharge 5–6''<br/>The giant hurls a magical lightning bolt at a point it can see within <<range 500>> of it. Each creature within <<sphere 10>> of that point must make a <<save Dex 17>>, taking <<lightning 12d8>> on a failed save, or <<halved>> on a successful one. |<|
A churning storm cloud forms, centered on a point you can see and spreading to a radius of 360 feet. Lightning flashes in the area, thunder booms, and strong winds roar. Each creature under the cloud (no more than 5,000 feet beneath the cloud) when it appears must make a Constitution saving throw. On a failed save, a creature takes 2d6 thunder damage and becomes deafened for 5 minutes.

Each round you maintain concentration on this spell, the storm produces additional effects on your turn.

<b>Round 2.</b>
Acidic rain falls from the cloud. Each creature and object under the cloud takes 1d6 acid damage.

<b>Round 3.</b>
You call six bolts of lightning from the cloud to strike six creatures or objects of your choice beneath the cloud. A given creature or object can’t be struck by more than one bolt. A struck creature must make a Dexterity saving throw. The creature takes 10d6 lightning damage on a failed save, or half as much damage on a successful one.

<b>Round 4.</b>
Hailstones rain down from the cloud. Each creature under the cloud takes 2d6 bludgeoning damage.

<b>Round 5-10.</b>
Gusts and freezing rain assail the area under the cloud. the area becomes difficult terrain and is heavily obscured. Each creature there takes 1d6 cold damage. Ranged weapon attacks in the area are impossible. The wind and rain count as a severe distraction for the purposes of maintaining concentration on spells. Finally, gusts of strong wind (ranging from 20 to 50 miles per hour) automatically disperse fog, mists, and similar phenomena in the area whether mundane or magical.
At 20th level, you have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.

Once you use this feature, you can’t use it again until you finish a short or long rest.
* A stunned creature is [[Incapacitated]], can't move, and can speak only falteringly.
* The creature automatically fails Strength and Dexterity saving throws.
* Attack rolls against the creature have advantage.
Starting at 5th level, you can interfere with the flow of ki in an opponent’s body. When you hit another creature with a melee weapon attack, you can spend 1 [[Ki]] point to attempt a stunning strike. The target must succeed on a Constitution saving throw or be stunned until the end of your next turn.
<<vtabs "[tag[Stylesheet]sort[]]">>
When you cast a spell, you can spend 1 sorcery point to cast it without any somatic or verbal components.
"""
''Telepathic Bond.'' The fiend ignores the range restriction on its telepathy when communicating with a creature it has charmed. The two don’t even need to be on the same plane of existence.
''Shapechanger.'' The fiend can use its action to polymorph into a Small or Medium humanoid, or back into its true form. Without wings, the fiend loses its flying speed. Other than its size and speed, its statistics are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +5>><br/>''Fiend Form Only''|<<slashing 1d6+3>> |<<reach 5>> |
| !Charm|One humanoid the fiend can see within 30 feet of it must succeed on a <<save Wis 15>> or be magically [[Charmed]] for <<time 1d>>. The [[Charmed]] target obeys the fiend’s verbal or telepathic commands. If the target suffers any harm or receives a suicidal command, it can repeat the saving throw, ending the effect on a success. If the target successfully saves against the effect, or if the effect on it ends, the target is immune to this fiend’s Charm for the next <<time 24h>>.<br/>The fiend can have only one target charmed at a time. If it charms another, the effect on the previous target ends. |<|
| !Draining Kiss|The fiend kisses a creature charmed by it or a willing creature. The target must make a <<save Con 15>> against this magic, taking <fail><<psychic 5d10+5>></fail>, or <pass><<halved>></pass>. The target’s hit point maximum is reduced by an amount equal to the damage taken. This reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0. |<|
| !Etherealness|The fiend magically enters the Ethereal Plane from the Material Plane, or vice versa. |<|
A creature can ''hold its breath'' for a number of minutes equal to ''1 + its Constitution modifier'' (minimum of 30 seconds).

When a creature runs out of breath or is choking, it can survive for a number of rounds equal to its Constitution modifier (minimum of 1 round). At the start of its next turn, it drops to 0 hit points and is dying, and it can't regain hit points or be stabilized until it can breathe again.

For example, a creature with a Constitution of 14 can hold its breath for 3 minutes. If it starts suffocating, it has 2 rounds to reach air before it drops to 0 hit points.
You suggest a course of activity (limited to a sentence or two) and magically influence a creature you can see within range that can hear and understand you. Creatures that can’t be [[Charmed]] are immune to this effect. The suggestion must be worded in such a manner as to make the course of action sound reasonable. Asking the creature to stab itself, throw itself onto a spear, immolate itself, or do some other obviously harmful act ends the spell.

The target must make a Wisdom saving throw. On a failed save, it purses the course of action you described to the best of its ability. The suggested course of action can continue for the entire duration. If the suggested activity can be completed in a shorter time, the spell ends when the subject finishes what it was asked to do.

You can also specify conditions that will trigger a special activity during the duration. For example, you might suggest that a knight give her warhorse to the first beggar she meets. If the condition isn’t met before the spell expires, the activity isn’t preformed.

If you or any of your companions damage the target, the spell ends.
|max top|k
| !Demon | !Source | !CR | !Charisma | !Notes |
|!<<mob Babau>> | !Volo | 4 | 13 (+1) |Good fighter, decent hitpoints and ac, nice selection of at-will abilities |
|!<<mob Barlgura>> | !MM | 5 | 9 (-1) |Brawler, berserker, low hp low ac |
|!<<mob Tanarukk>> | !Volo | 5 | 9 (-1) |Resistant to magic (no disadvantage to resist control), better berserker |
|!<<mob Vrock>> | !MM | 5 | 8 (-1) |Dangerous area effect abilities - Spores and Stunning Screech |
This item appears to be a longsword hilt. While grasping the hilt, you can use a bonus action to cause a blade of pure radiance to spring into existence, or make the blade disappear. While the blade exists, this magic longsword has the finesse property. If you are proficient with shortswords or longswords, you are proficient with the sun blade.

You gain a +2 bonus to attack and damage rolls made with this weapon, which deals radiant damage instead of slashing damage. When you hit an undead with it, that target takes an extra <<radiant 1d8>>.

The sword’s luminous blade emits <<bright 15>> and an additional <<dim 15>>. The light is sunlight. While the blade persists, you can use an action to expand or reduce its radius of bright and dim light by 5 feet each, to a maximum of 30 feet each or a minimum of 10 feet each.
A beam of brilliant light flashes out from your hand in a 5-foot-wide, 60-foot-line.
Each creature in the line must make a Constitution saving throw. On a failed save, a creature takes 6d8 radiant damage and is blinded until your next turn. On a successful save, it takes half as much damage and isn’t blinded by this spell. Undead and oozes have disadvantage on this saving throw.

You can create a new line of radiance as your action on any turn until the spell ends.

For the duration, a mote of brilliant radiance shines in your hand. It sheds bright light in a 30-foot radius and dim light for an additional 30 feet. The light is sunlight.
Brilliant sunlight flashes in a 60-foot radius centered on a point you choose within range.
Each creature in that light must make a Constitution saving throw. On a failed save, a creature takes 12d6 radiant damage and is blinded for 1 minute. On a successful save, it takes half as much damage and isn’t blinded by this spell. Undead and oozes have disadvantage on this saving throw.

A creature blinded by this spell makes another Constitution saving throw at the end of each of its turns. On a successful save, it is no longer blinded.

This spell dispels any darkness in its area that was created by a spell.
Starting at 15th level, your weapon attacks score a critical hit on a roll of 18–20.
At 15th level, you gain one of the following features of your choice.

''Evasion.'' When you are subjected to an effect, such as a red dragon’s fiery breath or a lightning bolt spell, that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on the saving throw, and only half damage if you fail.

''Stand Against the Tide.'' When a hostile creature misses you with a melee attack, you can use your reaction to force that creature to repeat the same attack against another creature (other than itself) of your choice.

''Uncanny Dodge.'' When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you.
At 20th level, when you roll initiative and have no uses of Bardic Inspiration left, you regain one use.
Starting at 17th level, when you would normally roll one or more dice to restore hit points with a spell, you instead use the highest number possible for each die. For example, instead of restoring 2d6 hit points to a creature, you restore 12.
Starting at 9th level, you have advantage on a Dexterity (Stealth) check if you move no more than half your speed on the same turn.
If you’re surprised, you can’t move or take an action on your first turn of the combat, and you can’t take a reaction until that turn ends. A member of a group can be surprised even if the other members aren’t.
At 18th level, you attain the pinnacle of resilience in battle. At the start of each of your turns, you regain hit points equal to 5 + your Constitution modifier if you have no more than half of your hit points left. You don’t gain this benefit if you have 0 hit points.
| !Druid Level | !Spells |
| !3rd |[[Darkness]], [[Acid Arrow]] |
| !5th |[[Water Walk]], [[Stinking Cloud]] |
| !7th |[[Freedom of Movement]], [[Locate Creature]] |
| !9th |[[Insect Plague]], [[Scrying]] |
"""
''Echolocation.'' The swarm can’t use its blindsight while deafened.
''Keen Hearing.'' The swarm has advantage on Wisdom (Perception) checks that rely on hearing.
''Swarm.'' The swarm can occupy another creature’s space and vice versa, and the swarm can move through any opening large enough for a Tiny bat. The swarm can’t regain hit points or gain temporary hit points.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +4>>|<<hp>>: <<piercing 2d4>><br/><<halved>>: <<piercing 1d4>> |<<reach 0>> |
"""
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny insect. The swarm can't regain hit points or gain temporary hit points.
"""
<<fold "Insect Swarms, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +3>>|<<hp>>: <<piercing 4d4>><br/><<halved>>: <<piercing 2d4>> |<<reach 0>> |
"""
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny insect. The swarm can't regain hit points or gain temporary hit points.
"""
<<fold "Insect Swarms, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +3>>|<<hp>>: <<piercing 4d4>><br/><<halved>>: <<piercing 2d4>> |<<reach 0>> |
|~|A creature reduced to <<hp 0>> by a swarm of centipedes is stable but [[Poisoned]] for <<time 1h>>, even after regaining hit points, and [[Paralyzed]] while [[Poisoned]] in this way. |<|
"""
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny insect. The swarm can't regain hit points or gain temporary hit points.
"""
<<fold "Insect Swarms, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +3>>|<<hp>>: <<piercing 4d4>><br/><<halved>>: <<piercing 2d4>> |<<reach 0>> |
"""
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny snake. The swarm can't regain hit points or gain temporary hit points.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +6>>|<<hp>>: <<piercing 2d6>><br/><<halved>>: <<piercing 1d6>> |<<reach 0>> |
|~|The target must make a <<save Con 10>>, taking <fail><<poison 4d6>></fail>, or <pass><<halved>></pass>. |<|
"""
''Blood Frenzy.'' The swarm has advantage on melee attack rolls against any creature that doesn't have all its hit points. 
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny quipper. The swarm can't regain hit points or gain temporary hit points.
''Water Breathing.'' The swarm can breathe only underwater.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +5>>|<<hp>>: <<piercing 4d6>><br/><<halved>>: <<piercing 2d6>> |<<reach 0>> |
"""
''Keen Smell.'' The swarm has advantage on Wisdom (Perception) checks that rely on smell.
''Swarm.'' The swarm can occupy another creature’s space and vice versa, and the swarm can move through any opening large enough for a Tiny rat. The swarm can’t regain hit points or gain temporary hit points.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +2>>|<<hp>>: <<piercing 2d6>><br/><<halved>>: <<piercing 1d6>> |<<reach 0>> |
"""
''Swarm.'' The swarm can occupy another creature’s space and vice versa, and the swarm can move through any opening large enough for a Tiny raven. The swarm can’t regain hit points or gain temporary hit points.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beaks +4>>|<<hp>>: <<piercing 2d6>><br/><<halved>>: <<piercing 1d6>> |<<reach 0>> |
"""
''Spider Climb.'' The swarm can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Web Sense.'' While in contact with a web, the swarm knows the exact location of any other creature in contact with the same web.
''Web Walker.'' The swarm ignores movement restrictions caused by webbing.
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny insect. The swarm can't regain hit points or gain temporary hit points.
"""
<<fold "Insect Swarms, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +3>>|<<hp>>: <<piercing 4d4>><br/><<halved>>: <<piercing 2d4>> |<<reach 0>> |
"""
''Swarm.'' The swarm can occupy another creature's space and vice versa, and the swarm can move through any opening large enough for a Tiny insect. The swarm can't regain hit points or gain temporary hit points.
"""
<<fold "Insect Swarms, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bites +3>>|<<hp>>: <<piercing 4d4>><br/><<halved>>: <<piercing 2d4>> |<<reach 0>> |
A monster that has a swimming speed doesn't need to spend extra movement to swim.
When you attack a creature with this magic weapon and roll a 20 on the attack roll, that target takes an extra <<necrotic 10>> damage if it isn't a construct or an undead. You also gain <<temp-hp 10>>.
When you attack an object with this magic sword and hit, maximize your weapon damage dice against the target.

When you attack a creature with this weapon and roll a 20 on the attack roll, that target takes an extra <<slashing 14>>. Then roll another <<roll d20>>. If you roll a 20, you lop off one of the target’s limbs, with the effect of such loss determined by the DM. If the creature has no limb to sever, you lop off a portion of its body instead.

In addition, you can speak the sword’s command word to cause the blade to shed <<bright 10>> and an additional <<dim 10>>. Speaking the command word again or sheathing the sword puts out the light.
Hit points lost to this weapon’s damage can be regained only through a short or long rest, rather than by regeneration, magic, or any other means.

Once per turn, when you hit a creature with an attack using this magic weapon, you can wound the target. At the start of each of the wounded creature’s turns, it takes <<necrotic 1d4>> for each time you’ve wounded it, and it can then make a <<save Con 15>>, ending the effect of all such wounds on itself on a success. Alternatively, the wounded creature, or a creature within 5 feet of it, can use an action to make a <<medicine 15>>, ending the effect of such wounds on it on a success.
R0lGODlhAAEAAYABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5wJWEuz3rz7D4bidpXAiKbqyrbuYZrvTNf2zcUxzvf+j9LtgMSi8WgQypDMppOlXD6n1KokerFqt9wAFtMNi5Hfsfncw6LX7Fm0DY8HdfK6PUe/6/cOIf8PmJQXSGjnV4gYd5jIiLbYCBn2GElpNVmJ6XSZyWm02Qnq8xlKajNaiupymsqastoKC/IaS0syWIsre5vLazvUC5wxG0ws+FuMzDCc3LvMnOv8XBstHUtd3XqNnaq9/ScFMQzubfhlfq5ErofO3g6mrugubw4vN3//Vg+Hz3+sv9Yv4Il/+wTeI2jvXR96D7IghMTwIauIElFRrEjqIkb+UBo3curoERPIkJRGkoRY5mQnkyoTsWxZ6CXMdQO9pBQ085tDm2pg7MxZUApFf0DHpDOWD+m4opZ68kz6dBdTTRGHypxqip1Pp1FvYuUhD8HFsF/dkK3gVay7sioOKkuL9ixbDfjCwV1Qd27DvBGudl2rVyDdu3v7ATVYczBXYYg9Nv4w1FdAjJMlb4X6kzHfh27xlLh8VGlizYAltoO8yKpU0oTrtaZwU3U3tVARrvYc2+u5EbddE1WMDvSj07o+V+xt96xs4pIV2v69kJ/wW4ZZjyaIfDrf5dL7Lv3XG7FQ3eIz0zYP/nf58VzXG4+LXp9U9++5i8f7Xb56+jX+7T8+H59v3/HXH3n0KZAdOasRqB04DMIXIDwL8tfge3/9Nx1l+x0oGnUUQujccxZWWNmFDn4IYIjYDYiifwYhCJ1+I3b4n4uCgXjdijOaeCOPPz2YYo7p7QikjSVmqCGRLRroHoz5yYhekUyu5+SOQ0a5ZHsoInkcixz6qNCWXJrmZZM0nmgmjhvNlyVmXwa5JlFSaplmio7J2WZoYG4m3J1LzelmnX3G+Weew705aJIzAqqnmKL5uaihHgr6KKGRfmlkdyBCah6jh1LaFachejoplVWqqOOlaWbK51+i5ijpMY4mqM6Eq055n5qWYnkrnabCuauKsaL565hklln+HolhIupqsLBiiiuGHYa04a+sdmbssbxaG+2LugaLX6+BFjutqOFy62uy3yoqLLTpSluus6fmumeQPdpJLZ7iNgpqjKl26u649OL76rw1dntkovLi6G29ymKrMLvtoiswvLRKWC2918oVr7kG97hxadl2qSTF/Kq77sL2lhiyVgafxKbJnw4cscora9pycCnb/LByCGs6ssTnHvxuwh3nWyjKOXd0MZQAK/0zxJWqZCvRFRvdtNMTW31yw8C2FDPXM98bNM9ndrb0YlODnTHLUYtcttl7Mpe2nnHLrfHbzH0NU9VuF91q1iKWDLLeOu/MNrI4G77by0X5vTjgHB/+PRPk2zF+l+Dabhv51fMMjWrihHfedavNTrVJ4ZLvfTfVbX9+9o/VIX4YdH97zjrlTFleWt3xaS733En5vnWEtSveO+a3AV8w6HQr/7peNDrvssOxq637V8ujDf3ooWOVOverYz8b0laKj3vm/mq/ffLj2z299LTDbr3w569f1ic+v8+7/NRT75Sc/c9/zntL9VpmwCfJT38HVN4ACfhAhqUGcwCEYALv17j6HW5lFmwAA6tiuAsaz4IfDGAIPyakDsYPgPXRWwVVGJ0n5eZ9L4RhDDEYGiOx0IaFsd3wfrZDHvbQSjx6GAdrKMQbBiiH3RLhCJO4wo8ZMWi1gaL+E0M3CO5c8XtWPCLopqiULaawiyj0YAt9JUYywmYUZwyUGMeoxjIaEIw2eWMcrbPEArXHjnfEIxevB0cf9bE5RKQjCwM5yC0O8RTYS+QVGNmaRjrykeEhjCQnSUkfkq+KmASOvqp4yU5OoDZj4aQoCWkhHZ5SBD9c3SrnkMUmvtIVsSzaLKHAnordsgW5LN0uVbET1fySBu+wyjDBoptjIjOUynyBX5rZltdAE5jMnOYKnmlNVkozm9GsJjd5s81vgtOb4iyOKctJS3KiswPYXKcny+fORTIvnt5RJz3XaM97ZhJ++jQnP/vpgXYCVInzHCgKC2lQfJ4zoX5EKENZ91nQh8ZOov7EH0Xl6dCLYvSPGiXoEzuqSJDiRoEixWhJR/rRk9JOpfJk6TsR6dJNxVShHJ0paGxKU5wqVKejTKlOffrTmvKUJ0PtaVEfedS+JFWpS91IAQAAOw==
When you cast this spell, you inscribe a harmful glyph either on a surface (such as a section of floor, a wall, or a table) or within an object that can be closed to conceal the glyph (such as a book, a scroll, or a treasure chest).
If you choose a surface, the glyph can cover an area of the surface no larger than 10 feet in diameter. If you choose an object, that object must remain in its place; if the object is moved more than 10 feet from where you cast this spell, the glyph is broken, and the spell ends without being triggered.

The glyph is nearly invisible, requiring an Intelligence (Investigation) check against your spell save DC to find it.

You decide what triggers the glyph when you cast the spell. For glyphs inscribed on a surface, the most typical triggers include touching or stepping on the glyph, removing another object covering it, approaching within a certain distance of it, or manipulating the object that holds it. For glyphs inscribed within an object, the most common triggers are opening the object, approaching within a certain distance of it, or seeing or reading the glyph.

You can further refine the trigger so the spell is activated only under certain circumstances or according to a creature's physical characteristics (such as height or weight), or physical kind (for example, the ward could be set to affect hags or shapechangers). You can also specify creatures that don't trigger the glyph, such as those who say a certain password.

When you inscribe the glyph, choose one of the options below for ist effect. Once triggered, the glyph glows, filling a 60-foot-radius sphere with dim light for 10 minutes, after which time the spell ends. Each creature in the sphere when the glyph activates is targeted by its effect, as is a creature that enters the sphere for the first time on a turn or ends its turn there.

<b>Death</b>
Each target must make a Constitution saving throw, taking 10d10 necrotic damage on a failed save, or half as much damage on a successful save.

<b>Discord
</b>Each target must make a Constitution saving throw. On a failed save, a target bickers and argues with other creatures for 1 minute. During this time, it is incapable of meaningful communication and has disadvantage on attack rolls and ability checks.
<b>Fear
</b>Each target must make a Wisdom saving throw and becomes frightened for 1 minute on a failed save. While frightened, the target drops whatever it is holding and must move at least 20 feet away from the glyph on each of ist turns, if able.&nbsp;
<b>
Hopelessness
</b>Each target must make a Charisma saving throw. On a failed save, the target is overwhelmed with despair for 1 minute. During this time, it can't attack or target any creature with harmful abilities, spells, or other magical effects.

<b>Insanity
</b>Each target must make an Intelligence saving throw. On a failed save, the target is driven insane for 1 minute. An insane creature can't take actions, can't understand what other creatures say, can't read, and speaks only in gibberish. The DM controls its movement, which is erratic.

<b>Pain
</b>Each target must make a Constitution saving throw and becomes [[Incapacitated]] with excruciating pain for 1 minute on a failed save.

<b>Sleep
</b>Each target must make a Wisdom saving throw and falls unconscious for 10 minutes on a failed save. A creature awakens if it takes damage or if someone uses an action to shake or slap it awake.

<b>Stunning
</b>Each target must make a Wisdom saving throw and becomes [[Stunned]] for 1 minute on a failed save.
<tr><th valign="top" align="left"><p><$link to={{!!title}}><$list filter="[all[current]has[icon]]"><$image source={{!!icon}} height=14 /></$list><$list filter="[all[current][has[caption]]"><$view field=caption /></$list><$list filter ="[all[current]!has[caption]]"><$view field=title /></$list></$link></p></th><td><$transclude field="text" mode="block" /></td></tr>
This talisman is a mighty symbol of goodness. A creature that is neither good nor evil in alignment takes <<radiant 6d6>> upon touching the talisman. An evil creature takes <<radiant 8d6>> upon touching the talisman. Either sort of creature takes the damage again each time it ends its turn holding or carrying the talisman.

If you are a good cleric or paladin, you can use the talisman as a holy symbol, and you gain a +2 bonus to spell attack rolls while you wear or hold it.

The talisman has 7 charges. If you are wearing or holding it, you can use an action to expend 1 charge from it and choose one creature you can see on the ground within 120 feet of you. If the target is of evil alignment, a flaming fissure opens under it. The target must succeed on a <<save Dex 20>> or fall into the fissure and be destroyed, leaving no remains. The fissure then closes, leaving no trace of its existence. When you expend the last charge, the talisman disperses into motes of golden light and is destroyed.
When you make an Intelligence (Arcana) check to control a [[Sphere of Annihilation]] while you are holding this talisman, you double your proficiency bonus on the check. In addition, when you start your turn with control over a sphere of annihilation, you can use an action to levitate it 10 feet plus a number of additional feet equal to 10 × your Intelligence modifier.
This item symbolizes unrepentant evil. A creature that is neither good nor evil in alignment takes <<necrotic 6d6>> upon touching the talisman. A good creature takes <<necrotic 8d6>> upon touching the talisman. Either sort of creature takes the damage again each time it ends its turn holding or carrying the talisman.

If you are an evil cleric or paladin, you can use the talisman as a holy symbol, and you gain a +2 bonus to spell attack rolls while you wear or hold it.

The talisman has 6 charges. If you are wearing or holding it, you can use an action to expend 1 charge from the talisman and choose one creature you can see on the ground within 120 feet of you. If the target is of good alignment, a flaming fissure opens under it. The target must succeed on a <<save Dex 20>> or fall into the fissure and be destroyed, leaving no remains. The fissure then closes, leaving no trace of its existence. When you expend the last charge, the talisman dissolves into foul-smelling slime and is destroyed.
"""
''Legendary Resistance (3/Day).'' If the tarrasque fails a saving throw, it can choose to succeed instead.
''Magic Resistance.'' The tarrasque has advantage on saving throws against spells and other magical effects.
''Reflective Carapace.'' Any time the tarrasque is targeted by a [[Magic Missile]] spell, a line spell, or a spell that requires a ranged attack roll, <<roll 1d6>>. On a 1 to 5, the tarrasque is unaffected. On a 6, the tarrasque is unaffected, and the effect is reflected back at the caster as though it originated from the tarrasque, turning the caster into the target.
''Siege Monster.'' The tarrasque deals double damage to objects and structures.
"""
<<divider>>
''Multiattack.'' The tarrasque can use its Frightful Presence. It then makes five attacks: one with its bite, two with its claws, one with its horns, and one with its tail. It can use its Swallow instead of its bite.

|max top|k
| !<<actions>> Actions |<|<|
| !<<melee Bite +19>>|<<piercing 4d12+10>> |<<reach 10>> |
|~|If the target is a creature, it is [[Grappled]] (<<skillcheck Escape 20>>). Until this grapple ends, the target is [[Restrained]], and the tarrasque can’t bite another target. |<|
| !<<melee Claw +19>>|<<slashing 4d8+10>> |<<reach 15>> |
| !<<melee Horns +19>>|<<piercing 4d10+10>> |<<reach 10>> |
| !<<melee Tail +19>>|<<bludgeoning 4d6+10>> |<<reach 20>> |
|~|If the target is a creature, it must succeed on a <<save Str 20>> or be knocked [[Prone]]. |<|
| !Frightful Presence|Each creature of the tarrasque’s choice within <<range 120>> of it and aware of it must succeed on a <<save Wis 17>> or become [[Frightened]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, with disadvantage if the tarrasque is within line of sight, ending the effect on itself on a success. If a creature’s saving throw is successful or the effect ends for it, the creature is immune to the tarrasque’s Frightful Presence for the next <<time 24h>>. |<|
| !Swallow|The tarrasque makes one bite attack against a Large or smaller creature it is grappling. If the attack hits, the target takes the bite’s damage, the target is swallowed, and the grapple ends. While swallowed, the creature is [[Blinded]] and [[Restrained]], it has [[Total Cover]] against attacks and other effects outside the tarrasque, and it takes <<acid 16d6>> at the start of each of the tarrasque’s turns.<br/>&nbsp;<br/>If the tarrasque takes <<damage 60>> or more on a single turn from a creature inside it, the tarrasque must succeed on a <<save Con 20>> at the end of that turn or regurgitate all swallowed creatures, which fall [[Prone]] in a space within 10 feet of the tarrasque. If the tarrasque dies, a swallowed creature is no longer [[Restrained]] by it and can escape from the corpse by using 30 feet of movement, exiting [[Prone]]. |<|
| !<<action>> Legendary Actions (3/round) |<|<|
| !Attack|The tarrasque makes one claw attack or tail attack. |<|
| !Move|The tarrasque moves up to half its speed. |<|
| !Chomp|''Costs 2 Actions.''<br/>The tarrasque makes one bite attack or uses its Swallow. |<|
You gain the ability to move or manipulate creatures or objects by thought.
When you cast the spell, and as your action each round for the duration, you can exert your will on one creature or object that you can see within range, causing the appropriate effect below. You can affect the same target round after round, or choose a new one at any time. If you switch targets, the prior target is no longer affected by the spell.

<b>Creature
</b>You can try to move a Huge or smaller creature. Make an ability check with your spellcasting ability contested by the creature’s Strength check. If you win the contest, you move the creature up to 30 feet in any direction, including upward but not beyond the range of this spell. Until the end of your next turn, the creature is [[Restrained]] in your telekinetic grip. A creature lifted upward is suspended in mid-air.
On subsequent rounds, you can use your action to attempt to maintain your telekinetic grip on the creature by repeating the contest.

<b>Object
</b>You can try to move an object that weighs up to 1,000 pounds. If the object isn’t being worn or carried, you automatically move it up to 30 feet in any direction, but not beyond the range of this spell.
If the object is worn or carried by a creature, you must make an ability check with your spellcasting ability contested by that creature’s Strength check. If you succeed, you pull the object away from that creature and can move it up to 30 feet in any direction but not beyond the range of this spell.
You can exert fine control on objects with your telekinetic grip, such as manipulating a simple tool, opening a door or a container, stowing or retrieving an item from an open container, or pouring the contents from a vial.
You forge a telepathic link among up to eight willing creatures of your choice within range, psychically linking each creature to all the others for the duration. Creatures with Intelligence scores of 2 or less aren’t affected by this spell.

Until the spell ends, the targets can communicate telepathically through the bond whether or not they have a common language. The communication is possible over any distance, though it can’t extend to other planes of existence.
This spell instantly transports you and up to eight willing creatures of your choice that you can see within range, or a single object that you can see within range, to a destination you select. If you target an object, it must be able to fit entirely inside a 10-foot cube, and it can’t be held or carried by an unwilling creature.

The destination you choose must be known to you, and it must be on the same plane of existence as you. Your familiarity with the destination determines whether you arrive there successfully. The DM rolls d100 and consults the table.

| !Familiarity | !Mishap | !Similar Area | !Off Target | !On Target |
|Permanent circle  | — | — | — | 01-100 |
|Associated object | — | — | — | 01-100 |
|Very familiar     | 01-05 | 06-13  | 14-24 | 25-100 |
|Seen casually     | 01-33 | 34-43  | 44-53 | 54-100 |
|Viewed once       | 01-43 | 44-53  | 54-73 | 74-100 |
|Description       | 01-43 | 44-53  | 54-73 | 74-100 |
|False destination | 01-50 | 51-100 | — | — |

<b>Familiarity.</b>
"Permanent circle" means a permanent teleportation circle whose sigil sequence you know. "Associated object" means that you possess an object taken from the desired destination within the last six months, such as a book from a wizard's library, bed linen from a royal suite, or a chunk of marble from a lich's secret tomb.
"Very familiar" is a place you have been very often, a place you have carefully studied, or a place you can see when you cast the spell. "Seen casually" is someplace you have seen more than once but with which you aren't very familiar. "Viewed once" is a place you have seen once, possibly using magic. "Description" is a place whose location and appearance you know through someone else's description, perhaps from a map.
"False destination" is a place that doesn't exist. Perhaps you tried to scry an enemy's sanctum but instead viewed an illusion, or you are attempting to teleport to a familiar location that no longer exists.

<b>On Target</b>
You and your group (or the target object) appear where you want to.

<b>Off Target
</b>You and your group (or the target object) appear a random distance away from the destination in a random direction. Distance off target is 1d10 x 1d10 percent of the distance that was to be traveled. For example, if you tried to travel 120 miles, landed off target, and rolled a 5 and 3 on the two d10s, then you would be off target by 15 percent, or 18 miles. The DM determines the direction off target randomly by rolling a d8 and designating 1 as north, 2 as northeast, 3 as east, and so on around the points of the compass. If you were teleporting to a coastal city and wound up 18 miles out at sea, you could be in trouble.

<b>Similar Area
</b>You and your group (or the target object) wind up in a different area that's visually or thematically similar to the target area. If you are heading for your home laboratory, for example, you might wind up in another wizard's laboratory or in an alchemical supply shop that has many of the same tools and implements as your laboratory. Generally, you appear in the closest similar place, but since the spell has no range limit, you could conceivably wind up anywhere on the plane.

<b>Mishap
</b>The spell's unpredictable magic results in a difficult journey. Each teleporting creature (or the target object) takes 3d10 force damage, and the DM rerolls on the table to see where you wind up (multiple mishaps can occur, dealing damage each time).
As you cast the spell, you draw a 10-foot-diameter circle on the ground inscribed with sigils that link your location to a permanent teleportation circle of your choice whose sigil sequence you know and that is on the same plane of existence as you.
A shimmering portal opens within the circle you drew and remains open until the end of your next turn. Any creature that enters the portal instantly appears within 5 feet of the destination circle or in the nearest unoccupied space if that space is occupied.

Many major temples, guilds, and other important places have permanent teleportation circles inscribed somewhere within their confines. Each such circle includes a unique sigil sequence – a string of magical runes arranged in a particular pattern. When you first gain the ability to cast this spell, you learn the sigil sequences for two destinations on the Material Plane, determined by the DM. You can learn additional sigil sequences during your adventures. You can commit a new sigil sequence to memory after studying it for 1 minute.

You can create a permanent teleportation circle by casting this spell in the same location every day for one year. You need not use the circle to teleport when you cast the spell in this way.
!! Typed Templates

|!| !View | !Edit |
|^!Magic Item |ItemViewTemplate |ItemEditTemplate |
|^!Monster |MonsterViewTemplate<br/>MonsterTabTemplate |^MonsterEditTemplate |
|^!Spell |SpellUpperViewTemplate<br/>SpellLowerViewTemplate |^SpellEditTemplate |

!! Other Templates

<div class="tc-table-of-contents">
<<toc Template sort[title]>>
</div>
<<vtabs "[tag[Test]sort[]]">>
|''&lt;&lt;mark'' //label// //label-color// //value// //value-color//''&gt;&gt;'' |<<mark label grey value green>> |

<div style="display: flex; flex-wrap: wrap;"><div>

| !Damage Types |<|
|''&lt;&lt;damage'' //2d6+2//''&gt;&gt;'' |<<damage 2d6+2>> |
|''&lt;&lt;bludgeoning'' //2d6+2//''&gt;&gt;'' |<<bludgeoning 2d6+2>> |
|''&lt;&lt;piercing'' //2d6+2//''&gt;&gt;'' |<<piercing 2d6+2>> |
|''&lt;&lt;slashing'' //2d6+2//''&gt;&gt;'' |<<slashing 2d6+2>> |
|''&lt;&lt;acid'' //2d6+2//''&gt;&gt;'' |<<acid 2d6+2>> |
|''&lt;&lt;cold'' //2d6+2//''&gt;&gt;'' |<<cold 2d6+2>> |
|''&lt;&lt;fire'' //2d6+2//''&gt;&gt;'' |<<fire 2d6+2>> |
|''&lt;&lt;force'' //2d6+2//''&gt;&gt;'' |<<force 2d6+2>> |
|''&lt;&lt;lightning'' //2d6+2//''&gt;&gt;'' |<<lightning 2d6+2>> |
|''&lt;&lt;necrotic'' //2d6+2//''&gt;&gt;'' |<<necrotic 2d6+2>> |
|''&lt;&lt;poison'' //2d6+2//''&gt;&gt;'' |<<poison 2d6+2>> |
|''&lt;&lt;psychic'' //2d6+2//''&gt;&gt;'' |<<psychic 2d6+2>> |
|''&lt;&lt;radiant'' //2d6+2//''&gt;&gt;'' |<<radiant 2d6+2>> |
|''&lt;&lt;thunder'' //2d6+2//''&gt;&gt;'' |<<thunder 2d6+2>> |
|''&lt;&lt;heal'' //2d6+2//''&gt;&gt;'' |<<heal 2d6+2>> |
</div><div>

| !Encounters |<|
|''&lt;&lt;melee'' //Warhammer// //+7//''&gt;&gt;'' |<<melee Warhammer +7>> |
|''&lt;&lt;ranged'' //Longbow// //+7//''&gt;&gt;'' |<<ranged Longbow +7>> |
|''&lt;&lt;casted'' //Spell// //+7//''&gt;&gt;'' |<<casted Spell +7>> |
|''&lt;&lt;save'' //label// //value//''&gt;&gt;'' |<<save label value>> |
|''&lt;&lt;skillcheck'' //label// //value//''&gt;&gt;'' |<<skillcheck label value>> |
|''&lt;pass&gt;''//value//''&lt;/pass&gt;'' |<pass> value</pass> |
|''&lt;fail&gt;''//value//''&lt;/fail&gt;'' |<fail> value</fail> |
|''&lt;&lt;mob'' //monster//''&gt;&gt;'' |<<mob monster>> |
|''&lt;&lt;ac'' //10//''&gt;&gt;'' |<<ac 10>> |
|''&lt;&lt;hp'' //10//''&gt;&gt;'' |<<hp 10>> |
|''&lt;&lt;temp-hp'' //10//''&gt;&gt;'' |<<temp-hp 10>> |
|''&lt;&lt;roll'' //1d6//''&gt;&gt;'' |<<roll 1d6>> |
</div><div>


| !Icons |<|
|''&lt;&lt;advantage&gt;&gt;'' |<<advantage>> |
|''&lt;&lt;disadvantage&gt;&gt;'' |<<disadvantage>> |
|''&lt;&lt;ritual&gt;&gt;'' |<<ritual>> |
|''&lt;&lt;concentration&gt;&gt;'' |<<concentration>> |
|''&lt;&lt;upcast&gt;&gt;'' |<<upcast>> |
|''&lt;&lt;touch&gt;&gt;'' |<<touch>> |
|''&lt;&lt;instant&gt;&gt;'' |<<instant>> |
|''&lt;&lt;na&gt;&gt;'' |<<na>> |
|''&lt;&lt;halved&gt;&gt;'' |<<halved>> |
|''&lt;&lt;action&gt;&gt;'' |<<action>> |
|''&lt;&lt;ba&gt;&gt;'' |<<ba>> |
|''&lt;&lt;reaction&gt;&gt;'' |<<reaction>> |
|''&lt;&lt;round'' //1//''&gt;&gt;'' |<<round 1>> |
|''&lt;&lt;turn'' //1//''&gt;&gt;'' |<<turn 1>> |
|''&lt;&lt;tick&gt;&gt;'' |<<tick>> |
|''&lt;&lt;cross&gt;&gt;'' |<<cross>> |
|''&lt;&lt;dnd&gt;&gt;'' |<<dnd>> |
|''&lt;&lt;al&gt;&gt;'' |<<al>> |
</div><div>

| !Area Effects |<|
|''&lt;&lt;target&gt;&gt;'' |<<target>> |
|''&lt;&lt;self&gt;&gt;'' |<<self>> |
|''&lt;&lt;circle'' //20//''&gt;&gt;'' |<<circle 20>> |
|''&lt;&lt;square'' //20//''&gt;&gt;'' |<<square 20>> |
|''&lt;&lt;sphere'' //20//''&gt;&gt;'' |<<sphere 20>> |
|''&lt;&lt;cube'' //20//''&gt;&gt;'' |<<cube 20>> |
|''&lt;&lt;cone'' //20//''&gt;&gt;'' |<<cone 20>> |
|''&lt;&lt;cylinder'' //20//''&gt;&gt;'' |<<cylinder 20>> |
|''&lt;&lt;line'' //20//''&gt;&gt;'' |<<line 20>> |
|''&lt;&lt;wall'' //20//''&gt;&gt;'' |<<wall 20>> |
|''&lt;&lt;distance '' //20//''&gt;&gt;'' |<<distance 20>> |
|''&lt;&lt;range'' //30/60//''&gt;&gt;'' |<<range 30/60>> |
|''&lt;&lt;reach'' //5//''&gt;&gt;'' |<<reach 5>> |
</div><div>

| !Entities |<|
|''&lt;&lt;per'' //name//''&gt;&gt;'' |<<per name>> |
|''&lt;&lt;loc'' //name//''&gt;&gt;'' |<<loc name>> |
|''&lt;&lt;org'' //name//''&gt;&gt;'' |<<org name>> |
|''&lt;&lt;time'' //value//''&gt;&gt;'' |<<time value>> |
|''&lt;&lt;light'' //level//''&gt;&gt;'' |<<light level>> |
|''&lt;&lt;bright'' //20//''&gt;&gt;'' |<<bright 20>> |
|''&lt;&lt;dim'' //20//''&gt;&gt;'' |<<dim 20>> |
|''&lt;&lt;darkness'' //20//''&gt;&gt;'' |<<darkness 20>> |
|''&lt;&lt;difficult&gt;&gt;'' |<<difficult>> |
|''&lt;&lt;loot'' //value//''&gt;&gt;'' |<<loot value>> |
|''&lt;&lt;book'' //value//''&gt;&gt;'' |<<book value>> |
|''&lt;&lt;spellbook'' //value//''&gt;&gt;'' |<<spellbook value>> |
|''&lt;&lt;potion'' //value//''&gt;&gt;'' |<<potion value>> |
|''&lt;&lt;scroll'' //value//''&gt;&gt;'' |<<scroll value>> |
</div><div>

| !Abilities |<|
|''&lt;&lt;acrobatics'' //dc//''&gt;&gt;'' |<<acrobatics dc>> |
|''&lt;&lt;animalhandling'' //dc//''&gt;&gt;'' |<<animalhandling dc>> |
|''&lt;&lt;arcana'' //dc//''&gt;&gt;'' |<<arcana dc>> |
|''&lt;&lt;athletics'' //dc//''&gt;&gt;'' |<<athletics dc>> |
|''&lt;&lt;deception'' //dc//''&gt;&gt;'' |<<deception dc>> |
|''&lt;&lt;history'' //dc//''&gt;&gt;'' |<<history dc>> |
|''&lt;&lt;insight '' //dc//''&gt;&gt;'' |<<insight dc>> |
|''&lt;&lt;intimidation'' //dc//''&gt;&gt;'' |<<intimidation dc>> |
|''&lt;&lt;investigation'' //dc//''&gt;&gt;'' |<<investigation dc>> |
|''&lt;&lt;medicine'' //dc//''&gt;&gt;'' |<<medicine dc>> |
|''&lt;&lt;nature'' //dc//''&gt;&gt;'' |<<nature dc>> |
|''&lt;&lt;perception '' //dc//''&gt;&gt;'' |<<perception dc>> |
|''&lt;&lt;pp'' //dc//''&gt;&gt;'' |<<pp dc>> |
|''&lt;&lt;performance'' //dc//''&gt;&gt;'' |<<performance dc>> |
|''&lt;&lt;persuasion'' //dc//''&gt;&gt;'' |<<persuasion dc>> |
|''&lt;&lt;religion'' //dc//''&gt;&gt;'' |<<religion dc>> |
|''&lt;&lt;sleightofhand'' //dc//''&gt;&gt;'' |<<sleightofhand dc>> |
|''&lt;&lt;stealth'' //dc//''&gt;&gt;'' |<<stealth dc>> |
|''&lt;&lt;survival'' //dc//''&gt;&gt;'' |<<survival dc>> |
|''&lt;&lt;thievestools '' //dc//''&gt;&gt;'' |<<thievestools dc>> |

</div></div>
You manifest a minor wonder, a sign of supernatural power, within range. You create one of the following magical effects within range:

* Your voice booms up to three times as loud as normal for 1 minute.
* You cause flames to flicker, brighten, dim, or change color for 1 minute.
* You cause harmless tremors in the ground for 1 minute.
* You create an instantaneous sound that originates from a point of your choice within range, such as a rumble of thunder, the cry of a raven, or ominous whispers.
* You instantaneously cause an unlocked door or window to fly open or slam shut.
* You alter the appearance of your eyes for 1 minute.

If you cast this spell multiple times, you can have up to three of its 1-minute effects active at a time, and you can dismiss such an effect as an action.
You hone your skills in the larcenous arts. Burglars, bandits, cutpurses, and other criminals typically follow this archetype, but so do rogues who prefer to think of themselves as professional treasure seekers, explorers, delvers, and investigators. In addition to improving your agility and stealth, you learn skills useful for delving into ancient ruins, reading unfamiliar languages, and using magic items you normally couldn’t employ.

{{||RogueAdvancementTemplate}}
{{||ClassAbilityTemplate}}
| !Level | !Proficiency Bonus | !Sneak Attack | !Features |
| 1st | +2 | 1d6 |[[Expertise|Rogue Expertise]], [[Sneak Attack]], [[Thieves’ Cant]] |
| 2nd | +2 | 1d6 |[[Cunning Action]] |
| 3rd | +2 | 2d6 |//''Thief:''// [[Fast Hands]] and [[Second-Story Work]] |
| 4th | +2 | 2d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 5th | +3 | 3d6 |[[Uncanny Dodge]] |
| 6th | +3 | 3d6 |[[Expertise|Rogue Expertise]] |
| 7th | +3 | 4d6 |[[Evasion]] |
| 8th | +3 | 4d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 9th | +4 | 5d6 |//''Thief:''// [[Supreme Sneak]] |
| 10th | +4 | 5d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 11th | +4 | 6d6 |[[Reliable Talent]] |
| 12th | +4 | 6d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 13th | +5 | 7d6 |//''Thief:''// [[Use Magic Device]] |
| 14th | +5 | 7d6 |[[Blindsense]] |
| 15th | +5 | 8d6 |[[Slippery Mind]] |
| 16th | +5 | 8d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 17th | +6 | 9d6 |//''Thief:''// [[Thief's Reflexes]] |
| 18th | +6 | 9d6 |[[Elusive]] |
| 19th | +6 | 10d6 |[[Ability Score Improvement|Rogue Ability Score Improvement]] |
| 20th | +6 | 10d6 |[[Stroke of Luck]] |
You can cast bane once using a warlock spell slot. You can’t do so again until you finish a long rest.
When you reach 17th level, you have become adept at laying ambushes and quickly escaping danger. You can take two turns during the first round of any combat. You take your first turn at your normal initiative and your second turn at your initiative minus 10. You can’t use this feature when you are surprised.
This set of tools includes a small file, a set of lock picks, a small mirror mounted on a metal handle, a set of narrow-bladed scissors, and a pair of pliers. Proficiency with these tools lets you add your proficiency bonus to any ability checks you make to disarm traps or open locks.

Perhaps the most common tools used by adventurers, thieves’ tools are designed for picking locks and foiling traps. Proficiency with the tools also grants you a general knowledge of traps and locks.

''Components.'' Thieves’ tools include:

* a small file
* a set of lock picks
* a small mirror mounted on a metal handle
* a set of narrow-bladed scissors
* a pair of pliers

''History.'' Your knowledge of traps grants you insight when answering questions about locations that are renowned for their traps.

''Investigation and Perception.'' You gain additional insight when looking for traps, because you have learned a variety of common signs that betray their presence.

''Set a Trap.'' Just as you can disable traps, you can also set them. As part of a short rest, you can create a trap using items you have on hand. The total of your check becomes the DC for someone else’s attempt to discover or disable the trap. The trap deals damage appropriate to the materials used in crafting it (such as poison or a weapon) or damage equal to half the total of your check, whichever the DM deems appropriate.

| !Activity | !DC |
|!Pick a lock | Varies |
|!Disable a trap | Varies |
During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.

In addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.
''Prerequisite:'' 5th level, Pact of the Blade feature

You can attack with your pact weapon twice, instead of once, whenever you take the Attack action on your turn.

''A target with three-quarters cover has a +5 bonus to AC and Dexterity saving throws''. A target has three-quarters cover if about three-quarters of it is covered by an obstacle. The obstacle might be a portcullis, an arrow slit, or a thick tree trunk. 
"""
''Pack Tactics.'' The thug has advantage on an attack roll against a creature if at least one of the thug's allies is within 5 feet of the creature and the ally isn't [[Incapacitated]].
"""
<<divider>>
''Multiattack.'' The thug makes two melee attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Mace +4>>|<<bludgeoning 1d6+2>> |<<reach 5>> |
| !<<ranged "Heavy Crossbow" +2>>|<<piercing 1d10>> |<<range 100/400>> |
A wave of thunderous force sweeps out from you.
Each creature in a 15-foot cube originating from you must make a Constitution saving throw. On a failed save, a creature takes 2d8 thunder damage and is pushed 10 feet away from you. On a successful save, the creature takes half as much damage and isn’t pushed.

In addition, unsecured objects that are completely within the area of effect are automatically pushed 10 feet away from you by the spell’s effect, and the spell emits a thunderous boom audible out to 300 feet.
| !Settings | !Contents | !Menu Bar |
|^[[Tiddly Wiki Website|https://tiddlywiki.com/]]<br/>[[Basic Settings|GettingStarted]]<br/> [[Control Panel|$:/ControlPanel]] |^<$list filter="[tag[TableOfContents]sort[]]">{{||Link}}<br/></$list> |^<$list filter="[tag[$:/tags/MenuBar]sort[]]">{{||Link}}<br/></$list> |

<<htabs "[tag[TiddlyWiki]sort[]]">>
R0lGODlhAAEAAaEAAAAAAP///wAAAAAAACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsOi8fksvmMTqvX7Lb7DY/L5/S6/Y7P6/f8vv8PGCg4SFhoeIiYqLjI2Oj4CBkpOUlZaXmJmam5ydnp+QkaKjpKWmp6ipqqusra6voKGys7S1tre4ubq7vL2+v7CxwsPExcbHyMnKy8zNzs/AwdLT1NXW19jZ2tvc3d7f0NHi4+Tl5ufo5OAQCgu+5u5M5+G/9OFD9PXx9Eb5vPLyMPwj9a/ga2WDfBYKyC+Q4ilKBwIcOIJO4ltDhrYsP+ExQbbMyosWMHf+pEsgr58UPBCilhoSTpYSJLk6pe2rwosyTNVDZ7PlRwUydGiT6LFrUAk6jRpS+RtnTFNCpKpztPSb3KkOrQV1i7boX4tJXXsReSch3rtWzYVWjTatV3tu1VtWt5yp37Fq7Yu1LpVh3FF+9Ms096QgncN6/eJG6RII6KIavjwPAeL428sojlvzQ2G8WceZ/n0DtG+8yQ04fppn4/M1htGDTpHLBrHz1geyrq1Dhy+/7duPXsGcCLG3e9W2ON48ybh+TAGobz6dS/KubNsbr26iNvh9gOfntMyMLDm5+u8rz69Xe/s38PnzyI+PTr63ZvP7/+gCL+9vuPb8J/Ap6XwoAGclfggQoex8KCDuYm3YMSbgbQhBa219mFGgrWG1MGbOjgEHUFAKKCVJR44IkoCljFiiyq6KJ+V8QooxU02ofFjfRloSOAOfbI3hZAqsfFkOZ5YaR4SCZp2ofPgcFkk7hJFkaUngHF2YxWPibHlojR4SVfdYTZ1h1kkmXmmRzaoWZiebR5WR9wnibnnNHtYeedeOapnB989unnn8PpIShhdRa6GB+IJnpooYQsaoijkQp6yGgL7JeIpWARiYiU6Y3oZJmdelohmplqulxwlZJKXFeMrNbhmpOiagNWi8BGm6yF4Jqrh4rw2muco8Kqg5urElv+rK/HIhusd7OyGityu9ammrCPQiZfadYO0le2yUrLra/eNhvbtHEqywO613qn7rfOrksnidu6+64gwrZLbrnmBhVqvfnyu++d40brbyDODnwDwgbrq3Cq+C4McMMZPgzxff0W7PC84eopL7gJ62ovwBfr+7GxAT+JgMYTS/wHySNzvDLLgcKscgyuniryyxbHTHHIOXccL889V7yzziiXauuvQU+J8Qqm4vxzzSqg9erSRgP6AtVVU5u11kpD6NDTUP+WoNdfeyhqRWaf7Vra/bnNdrxwfyp23BGvPd7cY4uMd3dyQWI10CBvQBngWF+qat5/W3UzfhgybvJ8YqItMnh2MnNyudqZb+KxC5WL8nPXQ5diqNAupzM6OZ2nw/TRrG/60+uyz057JwUAADs=
!! Tiefling Traits

Tieflings share certain racial traits as a result of their infernal descent.

|^!Age |^Tieflings mature at the same rate as humans but live a few years longer. |
|^!Alignment |^Tieflings might not have an innate tendency toward evil, but many of them end up there. Evil or not, an independent nature inclines many tieflings toward a chaotic alignment. |
|^!Size |^Tieflings are about the same size and build as humans. Your size is Medium. |
|^!Speed |^Your base walking speed is 30 feet. |
|^!Darkvision |^Thanks to your infernal heritage, you have superior vision in dark and dim conditions. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can’t discern color in darkness, only shades of gray. |
|^!Languages |^You can speak, read, and write Common and Infernal. |
|^!Ability Score Increase |^Your Intelligence score increases by 1, and your Charisma score increases by 2. |
|^![[Hellish Resistance]] |^{{Hellish Resistance}} |
|^![[Infernal Legacy]] |^{{Infernal Legacy}} |

<<subraces Tiefling>>
"""
''Keen Smell.'' The tiger has advantage on Wisdom (Perception) checks that rely on smell.
''Pounce.'' If the tiger moves at least 20 feet straight toward a creature and then hits it with a claw attack on the same turn, that target must succeed on a <<save Str 13>> or be knocked [[Prone]]. If the target is prone, the tiger can make one bite attack against it as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1d10+3>> |<<reach 5>> |
| !<<melee Claw +5>>|<<slashing 1d8+3>> |<<reach 5>> |
You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4 + 1 turns in a row, during which you can use actions and move as normal.

This spell ends if one of the actions you use during this period, or any effects that you create during this period, affects a creature other than you or an object being worn or carried by someone other than you. In addition, the spell ends if you move to a place more than 1,000 feet from the location where you cast it.
Starting at 18th level, the primal magic that you wield causes you to age more slowly. For every 10 years that pass, your body ages only 1 year.
You have proficiency with artisan’s tools (tinker’s tools). Using those tools, you can spend 1 hour and 10 gp worth of materials to construct a Tiny clockwork device (AC 5, 1 hp). The device ceases to function after 24 hours (unless you spend 1 hour repairing it to keep the device functioning), or when you use your action to dismantle it; at that time, you can reclaim the materials used to create it. You can have up to three such devices active at a time.

When you create a device, choose one of the following options:

[[Clockwork Toy]]. {{Clockwork Toy}}

[[Fire Starter]]. {{Fire Starter}}

[[Music Box]]. {{Music Box}}
A set of tinker’s tools is designed to enable you to repair many mundane objects. Though you can’t manufacture much with tinker’s tools, you can mend torn clothes, sharpen a worn sword, and patch a tattered suit of chain mail.

''Components.'' Tinker’s tools include:

* a variety of hand tools
* thread
* needles
* a whetstone
* scraps of cloth and leather
* a small pot of glue.

''History.'' You can determine the age and origin of objects, even if you have only a few pieces remaining from the original.

''Investigation.'' When you inspect a damaged object, you gain knowledge of how it was damaged and how long ago.

''Repair.'' You can restore 10 hit points to a damaged object for each hour of work. For any object, you need access to the raw materials required to repair it. For metal objects, you need access to an open flame hot enough to make the metal pliable.

| !Activity | !DC |
|!Temporarily repair a disabled device | 10 |
|!Repair an item in half the time | 15 |
|!Improvise a temporary item using scraps | 20 |
<div style="display: flex;">
<<stat Tiny 10 Objects>>
<<stat Armor 18 Class>>
<<stat Hit 20 Points>>
</div>
<div style="display: flex;">
<<ability-value Strength 4>>
<<ability-value Dexterity 8>>
<<ability-value Constitution 10>>
<<ability-value Intelligence 3>>
<<ability-value Wisdom 3>>
<<ability-value Charisma 1>>
</div>

| !<<action>> Actions  |<|<|
| !<<melee Slam +8>>|<<bludgeoning 1d4+4>> |<<reach 5>> |
A 10-foot-radius immobile dome of force springs into existence around and above you and remains stationary for the duration. The spell ends if you leave its area.

Nine creatures of Medium size or smaller can fit inside the dome with you. The spell fails if its area includes a larger creature or more than nine creatures. Creatures and objects within the dome when you cast this spell can move through it freely. All other creatures and objects are barred from passing through it. Spells and other magical effects can’t extend through the dome or be cast through it. The atmosphere inside the space is comfortable and dry, regardless of the weather outside.

Until the spell ends, you can command the interior to become dimly lit or dark. The dome is opaque from the outside, of any color you choose, but it is transparent from the inside.
''Prerequisite:'' 5th level

As a reaction when you take damage, you can entomb yourself in ice, which melts away at the end of your next turn. You gain 10 temporary hit points per warlock level, which take as much of the triggering damage as possible. Immediately after you take the damage, you gain vulnerability to fire damage, your speed is reduced to 0, and you are [[Incapacitated]]. These effects, including any remaining temporary hit points, all end when the ice melts.

Once you use this invocation, you can’t use it again until you finish a short or long rest.
This book contains memory and logic exercises, and its words are charged with magic. If you spend <<time 48h>> over a period of <<time "&le;6d">> studying the book’s contents and practicing its guidelines, your Intelligence score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
This book contains guidelines for influencing and charming others, and its words are charged with magic. If you spend <<time 48h>> over a period of <<time "&le;6d">> studying the book’s contents and practicing its guidelines, your Charisma score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
This book contains intuition and insight exercises, and its words are charged with magic. If you spend <<time 48h>> over a period of <<time "&le;6d">> studying the book’s contents and practicing its guidelines, your Wisdom score increases by 2, as does your maximum for that score. The manual then loses its magic, but regains it in a century.
Starting at 13th level, you learn to touch the ki of other minds so that you understand all spoken languages. Moreover, any creature that can understand a language can understand what you say.
This spell grants the creature you touch the ability to understand any spoken language it hears. Moreover, when the target speaks, any creature that knows at least one language and can hear the target understands what it says.
<div class="tc-table-of-contents">

<<toc-selective-expandable "Tool"  "sort[title]">>

</div>
A tool helps you to do something you couldn't otherwise do, such as craft or repair an item, forge a document, or pick a lock. Your race, class, background, or feats give you proficiency with certain tools. Proficiency with a tool allows you to add your proficiency bonus to any ability check you make using that tool. Tool use is not tied to a single ability, since proficiency with a tool represents broader knowledge of its use. For example, the DM might ask you to make a Dexterity check to carve a fine detail with your woodcarver's tools, or a Strength check to make something out of particularly hard wood.

<<vtabs "[tag[Tools]sort[]]">>
"""
''Price per Dose:'' 600 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 15>> or become [[Poisoned]] for <<roll 4d6>> hours. 
** The [[Poisoned]] creature is [[Incapacitated]].
''A target with total cover can't be targeted directly by an attack or a spell'', although some spells can reach such a target by including it in an area of effect. A target has total cover if it is completely concealed by an obstacle.
Elves don’t need to sleep. Instead, they meditate deeply, remaining semiconscious, for 4 hours a day. (The Common word for such meditation is “trance.”) While meditating, you can dream after a fashion; such dreams are actually mental exercises that have become reflexive through years of practice. After resting in this way, you gain the same benefit that a human does from 8 hours of sleep.
Beginning at 11th level, you can enter a special meditation that surrounds you with an aura of peace. At the end of a long rest, you gain the effect of a sanctuary spell that lasts until the start of your next long rest (the spell can end early as normal). The saving throw DC for the spell equals 8 + your Wisdom modifier + your proficiency bonus.
This spell creates a magical link between a Large or larger inanimate plant within range and another plant, at any distance, on the same plane of existence. You must have seen or touched the destination plant at least once before. For the duration, any creature can step into the target plant and exit from the destination plant by using 5 feet of movement.
!! Purpose of a Trap

|^!Alarm |An alarm trap is designed to alert an area’s occupants of intruders. It might cause a bell or a gong to sound. This type of trap rarely involves a saving throw, because the alarm can’t be avoided when the trap goes off. |
|^!Delay |Some traps are designed to slow down enemies, giving a dungeon’s inhabitants time to mount a defense or flee. The hidden pit is a classic example of this kind of trap. A 10-foot-deep pit usually deals little damage and is easy to escape, but it serves its purpose by impeding intruders. Other examples of delaying traps include collapsing walls, a portcullis that drops from the ceiling, and a locking mechanism that shuts and bars a door. If a delaying trap has moving parts that directly threaten characters when they operate, the characters are usually required to make Dexterity saving throws to avoid harm. |
|^!Restrain |A restraining trap tries to keep its victims in place, leaving them unable to move. Such traps are often employed in conjunction with regular guard patrols, so that victims are periodically extricated and taken away to be dealt with. But in an ancient dungeon, the guards might be long gone.<br/> Restraining traps usually require a successful Strength saving throw to be avoided, but some don’t allow saving throws. In addition to dealing damage, a restraining trap also renders a creature unable to move. Making a subsequent successful Strength check (using the trap’s saving throw DC) or dealing damage against the trap can break it and free the captive. Examples include a bear trap, a cage that drops from a ceiling, and a device that flings a net. |
|^!Slay |Some traps are designed to eliminate intruders, plain and simple. Their effects include poisoned needles that spring out when a lock is tampered with, blasts of fire that fill a room, poison gas, and other lethal measures. Saving throws — usually Dexterity or Constitution — allow creatures to avoid or mitigate the trap’s effects. |

!! Elements of a Trap

|^!Level and Threat |^A trap’s level is actually a range of levels, equivalent to one of the tiers of play (levels 1–4, 5–10, 11–16, and 17–20), indicating the appropriate time to use the trap in your campaign. Additionally, each trap poses either a moderate, dangerous, or deadly threat, based on its particular details. |
|^!Detection |Most traps allow either a Wisdom (Perception) or Intelligence (Investigation) check to detect their triggers or other elements that can tip off their presence. If you stop to ask players for this information, they might suspect a hidden danger. |
|^!Trigger |^A simple trap activates when an event occurs that triggers it. This entry in a trap’s description gives the location of the trigger and the activity that causes the trap to activate. |
|^!Effect |A trap’s effect occurs after it activates. The trap might fire a dart, unleash a cloud of poison gas, cause a hidden enclosure to open, and so on. This entry specifies what the trap targets, its attack bonus or saving throw DC, and what happens on a hit or a failed saving throw. |
|^!Countermeasures |Traps can be detected or defeated in a variety of ways by using ability checks or magic. This entry in a trap’s description gives the means for counteracting the trap. It also specifies what happens, if anything, on a failed attempt to disable it. |

!!! Complex Traps

|^!Initiative |A complex trap takes turns as a creature does, because it functions over a period of time. This part of a trap’s description tells whether the trap is slow (acts on initiative count 10), fast (acts on initiative count 20), or very fast (acts on initiative count 20 and also initiative count 10). A trap always acts after creatures that have the same initiative count. |
|^!Active Elements |On a trap’s turn, it produces specific effects that are detailed in this part of its description. The trap might have multiple active elements, a table you roll on to determine its effect at random, or options for you to choose from. |
|^!Dynamic Elements |A dynamic element is a threat that arises or evolves while the trap functions. Usually, changes involving dramatic elements take effect at the end of each of the trap’s turns or in response to the characters’ actions. |
|^!Constant Elements |A complex trap poses a threat even when it is not taking its turn. The constant elements describe how these parts of the trap function. Most make an attack or force a saving throw against any creature that ends its turn within a certain area. |

<<fold "Trap Save DCs and Attack Bonuses Table">>

<<fold "Trap Damage Severity Table">>

!! Example Traps

<<vtabs "[tag[Trap]sort[]]">>
| !Character Level | !Trap Danger Level |<|<|
|~| !Setback | !Dangerous | !Deadly |
| !1st-4th |<<damage 1d10>> |<<damage 2d10>> |<<damage 4d10>> |
| !5th-10th |<<damage 2d10>> |<<damage 4d10>> |<<damage 10d10>> |
| !11th-16th |<<damage 4d10>> |<<damage 10d10>> |<<damage 18d10>> |
| !17th-20th |<<damage 10d10>> |<<damage 18d10>> |<<damage 24d10>> |
| !Trap Danger Level | !Save DC | !Attack Bonus |
|!Setback | 10-11 | +3 to +5 |
|!Dangerous | 12-15 | +6 to +8 |
|!Deadly | 16-20 | +9 to +12 |
While traveling, a group of adventurers can move at a normal, fast, or slow pace, as shown on the [[Travel Pace Table]]. The table states how far the party can move in a period of time and whether the pace has any effect. A fast pace makes characters less perceptive, while a slow pace makes it possible to sneak around and to search an area more carefully (see the "Activity While Traveling" section later in this chapter for more information).

''Forced March.'' The [[Travel Pace Table]] assumes that characters travel for 8 hours in day. They can push on beyond that limit, at the risk of exhaustion. 

For each additional hour of travel beyond 8 hours, the characters cover the distance shown in the ''Hour column'' for their pace, and each character must make a Constitution saving throw at the end of the hour. The DC is 10+ 1 for each hour past 8 hours. On a failed saving throw, a character suffers one level of exhaustion (see appendix A).

''Mounts and Vehicles.'' For short spans of time (up to an hour), many animals move much faster than humanoids. A mounted character can ride at a gallop for about an hour, covering twice the usual distance for a fast pace. If fresh mounts are available every 8 to 10
miles, characters can cover larger distances at this pace, but this is very rare except in densely populated areas.

Characters in wagons, carriages, or other land vehicles choose a pace as normal. Characters in a waterborne vessel are limited to the speed of the vessel (see chapter 5),and they don't suffer penalties for a fast pace or gain benefits from a slow pace, Depending on the vessel and the size of the crew, ships might be able to travel for up to 24 hours per day,

Certain special mounts, such as a pegasus or griffon, or special vehicles, such as a carpet of flying, allow you to travel more swiftly, The Dungeon Master's Guide contains more information on special methods of travel.

<<include "Travel Pace Table">>
| !Distance Traveled per . . . |<|<|<|<|
| !Pace | !Minute | !Hour | !Day | !Effect |
| !Fast | 400 feet | 4 miles | 30 miles |-5 penalty to passive Wisdom (Perception) scores |
| !Normal | 300 feel | 3 miles | 24 miles |&mdash; |
| !Slow | 200 feel | 2 miles | 18 miles |Able lo use stealth |
"""
''False Appearance.'' While the treant remains motionless, it is indistinguishable from a normal tree.
''Siege Monster.'' The treant deals double damage to objects and structures.
"""
<<divider>>
''Multiattack.'' The treant makes two slam attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +10>>|<<bludgeoning 3d6+6>> |<<reach 5>> |
| !<<ranged Rock +10>>|<<bludgeoning 4d10+6>> |<<range 60/180>> |
| !Animate Trees|''1/Day.''<br/>The treant magically animates one or two trees it can see within <<range 60>> of it. These trees have the same statistics as a treant, except they have Intelligence and Charisma scores of 1, they can’t speak, and they have only the Slam action option. An animated tree acts as an ally of the treant. The tree remains animate for <<time 1d>> or until it dies; until the treant dies or is more than <<range 120>> from the tree; or until the treant takes a bonus action to turn it back into an inanimate tree. The tree then takes root if possible. |<|
You gain the ability to enter a tree and move from inside it to inside another tree of the same kind within 500 feet.
Both trees must be living and at least the same size as you. You must use 5 feet of movement to enter a tree. You instantly know the location of all other trees of the same kind within 500 feet and, as part of the move used to enter the tree, can either pass into one of those trees or step out of the tree you’re in. You appear in a spot of your choice within 5 feet of the destination tree, using another 5 feet of movement. If you have no movement left, you appear within 5 feet of the tree you entered.

You can use this transportation ability once per round for the duration. You must end each turn outside a tree.
"""
''Pack Tactics.'' The warrior has advantage on an attack roll against a creature if at least one of the warrior’s allies is within 5 feet of the creature and the ally isn’t [[Incapacitated]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Spear +3>>|<<piercing 1d6+1>><br/><<piercing 1d8+1>> (''Two-handed'') |<<reach 5>><br/><<range 20/60>> |
"""
''Trampling Charge.'' If the triceratops moves at least 20 feet straight toward a creature and then hits it with a ''gore'' attack on the same turn, that target must succeed on a <<save Str 13>> or be knocked [[Prone]]. If the target is prone, the triceratops can make one ''stomp'' attack against it as a <<ba>>."""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Gore +9>>|<<piercing 4d8+6>> |<<reach 5>> |
| !<<melee Stomp +9>>|<<bludgeoning 3d10+6>> |<<reach 5>> (''[[Prone]] creature'') |
''Prerequisite:'' 7th level

You can cast freedom of movement once on yourself without expending a spell slot. You regain the ability to do so when you finish a long rest.
This trident is a magic weapon. It has 3 charges. While you carry it, you can use an action and expend 1 charge to cast [[Dominate Beast]] (<<save "Spell DC" 15>>) from it on a beast that has an innate swimming speed. The trident regains <<roll 1d3>> expended charges daily at dawn.
|max top|k
| !d100 | !Trinket |
| !01 |A mummified goblin hand |
| !02 |A piece of crystal that faintly glows in the moonlight |
| !03 |A gold coin minted in an unknown land |
| !04 |A diary written in a language you don’t know |
| !05 |A brass ring that never tarnishes |
| !06 |An old chess piece made from glass |
| !07 |A pair of knucklebone dice, each with a skull symbol on the side that would normally show six pips |
| !08 |A small idol depicting a nightmarish creature that gives you unsettling dreams when you sleep near it |
| !09 |A rope necklace from which dangles four mummified elf fingers |
| !10 |The deed for a parcel of land in a realm unknown to you |
| !11 |A 1-ounce block made from an unknown material |
| !12 |A small cloth doll skewered with needles |
| !13 |A tooth from an unknown beast |
| !14 |An enormous scale, perhaps from a dragon |
| !15 |A bright green feather |
| !16 |An old divination card bearing your likeness |
| !17 |A glass orb filled with moving smoke |
| !18 |A 1-pound egg with a bright red shell |
| !19 |A pipe that blows bubbles |
| !20 |A glass jar containing a weird bit of flesh floating in pickling fluid |
| !21 |A tiny gnome-crafted music box that plays a song you dimly remember from your childhood |
| !22 |A small wooden statuette of a smug halfling |
| !23 |A brass orb etched with strange runes |
| !24 |A multicolored stone disk |
| !25 |A tiny silver icon of a raven |
| !26 |A bag containing forty-seven humanoid teeth, one of which is rotten |
| !27 |A shard of obsidian that always feels warm to the touch |
| !28 |A dragon's bony talon hanging from a plain leather necklace |
| !29 |A pair of old socks |
| !30 |A blank book whose pages refuse to hold ink, chalk, graphite, or any other substance or marking |
| !31 |A silver badge in the shape of a five-pointed star |
| !32 |A knife that belonged to a relative |
| !33 |A glass vial filled with nail clippings |
| !34 |A rectangular metal device with two tiny metal cups on one end that throws sparks when wet |
| !35 |A white, sequined glove sized for a human |
| !36 |A vest with one hundred tiny pockets |
| !37 |A small, weightless stone block |
| !38 |A tiny sketch portrait of a goblin |
| !39 |An empty glass vial that smells of perfume when opened |
| !40 |A gemstone that looks like a lump of coal when examined by anyone but you |
| !41 |A scrap of cloth from an old banner |
| !42 |A rank insignia from a lost legionnaire |
| !43 |A tiny silver bell without a clapper |
| !44 |A mechanical canary inside a gnome-crafted lamp |
| !45 |A tiny chest carved to look like it has numerous feet on the bottom |
| !46 |A dead sprite inside a clear glass bottle |
| !47 |A metal can that has no opening but sounds as if it is filled with liquid, sand, spiders, or broken glass (your choice) |
| !48 |A glass orb filled with water, in which swims a clockwork goldfish |
| !49 |A silver spoon with an M engraved on the handle |
| !50 |A whistle made from gold-colored wood |
| !51 |A dead scarab beetle the size of your hand |
| !52 |Two toy soldiers, one with a missing head |
| !53 |A small box filled with different-sized buttons |
| !54 |A candle that can’t be lit |
| !55 |A tiny cage with no door |
| !56 |An old key |
| !57 |An indecipherable treasure map |
| !58 |A hilt from a broken sword |
| !59 |A rabbit’s foot |
| !60 |A glass eye |
| !61 |A cameo carved in the likeness of a hideous person |
| !62 |A silver skull the size of a coin |
| !63 |An alabaster mask |
| !64 |A pyramid of sticky black incense that smells very bad |
| !65 |A nightcap that, when worn, gives you pleasant dreams |
| !66 |A single caltrop made from bone |
| !67 |A gold monocle frame without the lens |
| !68 |A 1-inch cube, each side painted a different color |
| !69 |A crystal knob from a door |
| !70 |A small packet filled with pink dust |
| !71 |A fragment of a beautiful song, written as musical notes on two pieces of parchment |
| !72 |A silver teardrop earring made from a real teardrop |
| !73 |The shell of an egg painted with scenes of human misery in disturbing detail |
| !74 |A fan that, when unfolded, shows a sleeping cat |
| !75 |A set of bone pipes |
| !76 |A four-leaf clover pressed inside a book discussing manners and etiquette |
| !77 |A sheet of parchment upon which is drawn a complex mechanical contraption |
| !78 |An ornate scabbard that fits no blade you have found so far |
| !79 |An invitation to a party where a murder happened |
| !80 |A bronze pentacle with an etching of a rat's head in its center |
| !81 |A purple handkerchief embroidered with the name of a powerful archmage |
| !82 |Half of a floorplan for a temple, castle, or some other structure |
| !83 |A bit of folded cloth that, when unfolded, turns into a stylish cap |
| !84 |A receipt of deposit at a bank in a far-flung city |
| !85 |A diary with seven missing pages |
| !86 |An empty silver snuffbox bearing an inscription on the surface that says “dreams” |
| !87 |An iron holy symbol devoted to an unknown god |
| !88 |A book that tells the story of a legendary hero's rise and fall, with the last chapter missing |
| !89 |A vial of dragon blood |
| !90 |An ancient arrow of elven design |
| !91 |A needle that never bends |
| !92 |An ornate brooch of dwarven design |
| !93 |An empty wine bottle bearing a pretty label that says, “The Wizard of Wines Winery, Red Dragon Crush, 331422-W” |
| !94 |A mosaic tile with a multicolored, glazed surface |
| !95 |A petrified mouse |
| !96 |A black pirate flag adorned with a dragon's skull and crossbones |
| !97 |A tiny mechanical crab or spider that moves about when it’s not being observed |
| !98 |A glass jar containing lard with a label that reads, “Griffon Grease” |
| !99 |A wooden box with a ceramic bottom that holds a living worm with a head on each end of its body |
| !100 |A metal urn containing the ashes of a hero |
"""
''Keen Smell.'' The troll has advantage on Wisdom (Perception) checks that rely on smell.
''Regeneration.'' The troll regains <<heal 10>> at the start of its turn. If the troll takes <<acid acid>> or <<fire fire>> damage, this trait doesn’t function at the start of the troll’s next turn. The troll dies only if it starts its turn with <<hp 0>> and doesn’t regenerate.
<<fold "Loathsome Limbs, Variant">>
"""
<<divider>>
''Multiattack.'' The troll makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 1d6+4>> |<<reach 5>> |
| !<<melee Claw +7>>|<<slashing 2d6+4>> |<<reach 5>> |
Choose one creature or nonmagical object that you can see within range. You transform the creature into a different creature, the creature into an object, or the object into a creature (the object must be neither worn nor carried by another creature). The transformation lasts for the duration, or until the target drops to 0 hit points or dies. If you concentrate on this spell for the full duration, the transformation becomes permanent.

Shapechangers aren’t affected by this spell. An unwilling creature can make a Wisdom saving throw, and if it succeeds, it isn’t affected by this spell.

<b>Creature into Creature.</b>
If you turn a creature into another kind of creature, the new form can be any kind you choose whose challenge rating is equal to or less than the target’s (or its level, if the target doesn’t have a challenge rating). The target’s game statistics, including mental ability scores, are replaced by the statistics of the new form. It retains its alignment and personality.
The target assumes the hit points of its new form, and when it reverts to its normal form, the creature returns to the number of hit points it had before it transformed. If it reverts as a result of dropping to 0 hit points, any excess damage carries over to its normal form. As long as the excess damage doesn’t reduce the creature’s normal form to 0 hit points, it isn’t knocked unconscious.
The creature is limited in the actions it can perform by the nature of its new form, and it can’t speak, cast spells, or take any other action that requires hands or speech unless its new form is capable of such actions.
The target’s gear melds into the new form. The creature can’t activate, use, wield, or otherwise benefit from any of its equipment.

<b>Object into Creature.</b>
You can turn an object into any kind of creature, as long as the creature’s size is no larger than the object’s size and the creature’s challenge rating is 9 or lower. The creature is friendly to you and your companions. It acts on each of your turns. You decide what action it takes and how it moves. The DM has the creature’s statistics and resolves all of its actions and movement.
If the spell becomes permanent, you no longer control the creature. It might remain friendly to you, depending on how you have treated it.

<b>Creature into Object.</b>
If you turn a creature into an object, it transforms along with whatever it is wearing and carrying into that form. The creature’s statistics become those of the object, and the creature has no memory of time spent in this form, after the spell ends and it returns to its normal form.

This spell can’t affect a target that has 0 hit points.
You touch a creature that has been dead for no longer than 200 years and that died for any reason except old age. If the creature’s soul is free and willing, the creature is restored to life with all its hit points.

This spell closes all wounds, neutralizes any poison, cures all diseases, and lifts any curses affecting the creature when it died. The spell replaces damaged or missing organs or limbs.

The spell can even provide a new body if the original no longer exists, in which case you must speak the creature’s name. The creature then appears in an unoccupied space you choose within 10 feet of you.
This spell gives the willing creature you touch the ability to see things as they actually are. For the duration, the creature has truesight,  notices secret doors hidden by magic, and can see into the Ethereal Plane, all out to a range of 120 feet.
You extend your hand and point a finger at a target in range. Your magic grants you a brief insight into the target's defenses. On your next turn, you gain advantage on your first attack roll against the target, provided that this spell hasn&#8217;t ended.
A creature with truesight can, out to a specific range, see in normal and magical darkness, see invisible creatures and objects, automatically detect visual illusions and succeed on saving throws against them, and perceives the original form of a shapechanger or a creature that is transformed by magic. Furthermore, the creature can see into the Ethereal Plane.
"""
''Price per Dose:'' 150 gp
"""

* A creature subjected to this poison must succeed on a <<save Con 11>> or become [[Poisoned]] for <<time 1h>>. 
** The [[Poisoned]] creature can’t knowingly speak a lie, as if under the effect of a [[Zone of Truth]] spell.
As an action, you present your holy symbol and speak a prayer censuring fiends and undead, using your [[Channel Divinity]]. Each fiend or undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes damage.

A turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.

As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.

A turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.
When you cast a spell that targets only one creature and doesn’t have a range of self, you can spend a number of sorcery points equal to the spell’s level to target a second creature in range with the same spell (1 sorcery point if the spell is a cantrip).

To be eligible, a spell must be incapable of targeting more than one creature at the spell’s current level. For example, [[Magic Missile]] and [[Scorching Ray]] aren’t eligible, but [[Ray of Frost]] and [[Chromatic Orb]] are.

<<sections-vertical "[tag[Twinned Spell]]">>

When you take the Attack action and attack with a light melee weapon that you’re holding in one hand, you can use a bonus action to attack with a different light melee weapon that you’re holding in the other hand. You don’t add your ability modifier to the damage of the bonus attack, unless that modifier is negative.

If either weapon has the thrown property, you can throw the weapon, instead of making a melee attack with it.
When you engage in two-weapon fighting, you can add your ability modifier to the damage of the second attack.
''Multiattack.'' The tyrannosaurus makes two attacks: one with its bite and one with its tail. It can’t make both attacks against the same target.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +10>>|<<piercing 4d12+7>> |<<reach 10>> |
|~|If the target is a Medium or smaller creature, it is [[Grappled]], <<skillcheck Escape 17>>. Until this grapple ends, the target is [[Restrained]], and the tyrannosaurus can’t bite another target. |<|
| !<<melee Tail +10>>|<<bludgeoning 3d8+7>> |<<reach 10>> |
Instead of using a weapon to make a melee weapon attack, you can use an unarmed strike: a punch, kick, head-butt, or similar forceful blow (none of which count as weapons). 

* On a hit, an unarmed strike deals <<bludgeoning 1+Strength_Modifier>>.
* You are proficient with your unarmed strikes.
Beginning at 1st level, while you are wearing no armor and not wielding a shield, your AC equals 10 + your Dexterity modifier + your Wisdom modifier.
Starting at 2nd level, your speed increases by 10 feet while you are not wearing armor or wielding a shield. This bonus increases when you reach certain monk levels, as shown in the Monk table.

At 9th level, you gain the ability to move along vertical surfaces and across liquids on your turn without falling during the move.
At 10th level, your Unarmored Speed speed bonus increases to 20 feet while you are not wearing armor or wielding a shield.
At 14th level, your Unarmored Speed speed bonus increases to 25 feet while you are not wearing armor or wielding a shield.
At 18th level, your Unarmored Speed speed bonus increases to 30 feet while you are not wearing armor or wielding a shield.
At 6th level, your Unarmored Speed speed bonus increases to 15 feet while you are not wearing armor or wielding a shield.
At 9th level, you gain the ability to move along vertical surfaces and across liquids on your turn without falling during your move.
* An unconscious creature is [[Incapacitated]], can't move or speak, and is unaware of its surroundings
* The creature drops whatever it's holding and falls [[Prone]].
* The creature automatically fails Strength and Dexterity saving throws.
* Attack rolls against the creature have advantage.
* Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.
Undead are once-living creatures brought to a horrifying state of undeath through the practice of necromantic magic or some unholy curse. Undead include walking corpses, such as vampires and zombies, as well as bodiless spirits, such as ghosts and specters.

<<list-box "[tag[Undead]sort[]]" "No undead found.">>
| !Druid Level | !Spells |
| !3rd |[[Spider Climb]], [[Web]] |
| !5th |[[Gaseous Form]], [[Stinking Cloud]] |
| !7th |[[Greater Invisibility]], [[Stone Shape]] |
| !9th |[[Cloudkill]], [[Insect Plague]] |
!!! ''Underwater Movement''

* Characters with a swimming speed move at their swimming speed.
** Can swim all day without penalty.
* Characters without a swimming speed treats swimming underwater as difficult terrain (halved movement speed), 
** After each hour of swimming, a character must succeed on a DC 10 Constitution saving throw or gain one level of exhaustion.
* Swimming through deep water is similar to traveling at high altitudes, because of the water's pressure and cold temperature. 
** For a creature without a swimming speed, each hour spent swimming at a depth greater than 100 feet counts as 2 hours for the purpose of determining exhaustion. 
** Swimming for an hour at a depth greater than 200 feet counts as 4 hours.

!!! ''Underwater Combat''

* When making a ''melee weapon attack'', a creature that doesn’t have a swimming speed (either natural or granted by magic) has disadvantage on the attack roll unless the weapon is a dagger, javelin, shortsword, spear, or trident.
* A ''ranged weapon attack'' automatically misses a target beyond the weapon’s normal range. Even against a target within normal range, the attack roll has disadvantage unless the weapon is a crossbow, a net, or a weapon that is thrown like a javelin (including a spear, trident, or dart).
* Creatures and objects that are fully immersed in water have resistance to fire damage.

!!! ''Holding Breath''

A creature can hold its breath for a number of minutes equal to 1 + its Constitution modifier (minimum of 30 seconds). When a creature runs out of breath, it can survive for a number of rounds equal to its Constitution modifier (minimum 1 round). At the start of its next turn, it drops to 0 hit points and is dying, and it can’t regain hit points or be stabilized until it can breathe again. For example, a creature with a Constitution of 14 can hold its breath for 3 minutes. If it starts suffocating, it has 2 rounds to reach air before it drops to 0 hit points.

!!! ''Underwater Visibility''

Visibility underwater depends on water clarity and the available light. Unless the characters have light sources, they become aware of an encounter at a distance of 60 feet in clear water with bright light, 30 feet in clear water with dim light, and 10 feet in murky water or with no light.


When adventurers pursue sahuagin back to their undersea homes, fight off sharks in an ancient shipwreck, or find themselves in a flooded dungeon room, they must fight in a challenging environment. Underwater the following rules apply. 

When making a ''melee weapon attack'', a creature that doesn't have a swimming speed (either natural or granted by magic) has disadvantage on the attack roll unless the weapon is a dagger, javelin, shortsword, spear, or trident.

A ''ranged weapon attack'' automatically misses a target beyond the weapon's normal range. Even against a target within normal range, the attack roll has disadvantage unless the weapon is a crossbow, a net, or a weapon that is thrown like a javelin (including a spear,
trident, or dart). 

Creatures and objects that are fully immersed in water have resistance to fire damage.
"""
''Prerequisite:'' 5th-level warlock
"""

You can cast [[Animate Dead]] without using a spell slot. Once you do so, you can’t cast it in this way again until you finish a long rest.
"""
''Charge.'' If the unicorn moves at least 20 feet straight toward a target and then hits it with a horn attack on the same turn, the target takes an extra <<piercing 2d8>>. If the target is a creature, it must succeed on a <<save Str 15>> or be knocked [[Prone]].
''Innate Spellcasting.'' The unicorn’s innate spellcasting ability is Charisma (<<save "Spell DC" 14>>). The unicorn can innately cast the following spells, requiring no components:
&nbsp;&nbsp;&nbsp;&nbsp;''At will:'' [[Detect Evil and Good]], [[Druidcraft]], [[Pass Without Trace]]
&nbsp;&nbsp;&nbsp;&nbsp;''1/day each:'' [[Calm Emotions]], [[Dispel Evil and Good]], [[Entangle]]
''Magic Resistance.'' The unicorn has advantage on saving throws against spells and other magical effects.
''Magic Weapons.'' The unicorn’s weapon attacks are magical.
"""
<<divider>>
''Multiattack.'' The unicorn makes two attacks: one with its hooves and one with its horn.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +7>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
| !<<melee Horn +7>>|<<piercing 1d8+4>> |<<reach 5>> |
| !Healing Touch|''3/Day.''<br/>The unicorn touches another creature with its horn. The target magically regains <<heal 2d8+2>>. In addition, the touch removes all diseases and neutralizes all poisons afflicting the target. |<|
| !Teleport|''1/Day.''<br/>The unicorn magically teleports itself and up to three willing creatures it can see within 5 feet of it, along with any equipment they are wearing or carrying, to a location the unicorn is familiar with, up to 1 mile away. |<|
| !<<action>> Legendary Actions (3/Round) |<|<|
| !Hooves|The unicorn makes one attack with its hooves. |<|
| !Shimmering Shield|''Costs 2 Actions.''<br/>The unicorn creates a shimmering, magical field around itself or another creature it can see within <<range 60>>. The target gains a <<ac +2>> until the end of the unicorn’s next turn. |<|
| !Heal Self|''Costs 3 Actions.''<br/>The unicorn magically regains <<heal 2d8+2>>. |<|
This tube holds milky liquid with a strong alcohol smell. You can use an action to pour the contents of the tube onto a surface within reach. The liquid instantly dissolves up to 1 square foot of adhesive it touches, including [[Sovereign Glue]].
Combatants often try to escape their foes’ notice by hiding, casting the [[Invisibility]] spell, or lurking in darkness.

When you attack a target that you can’t see, you have disadvantage on the attack roll. This is true whether you’re guessing the target’s location or you’re targeting a creature you can hear but not see. If the target isn’t in the location you targeted, you automatically miss, but the GM typically just says that the attack missed, not whether you guessed the target’s location correctly.

When a creature can’t see you, you have advantage on attack rolls against it. If you are hidden&mdash;both unseen and unheard&mdash;when you make an attack, you give away your location when the attack hits or misses.
This spell creates an invisible, mindless, shapeless force that performs simple tasks at your command until the spell ends. The servant springs into existence in an unoccupied space on the ground within range. It has AC 10, 1 hit point, and a Strength of 2, and it can’t attack. If it drops to 0 hit points, the spell ends.

Once on each of your turns as a bonus action, you can mentally command the servant to move up to 15 feet and inteact with an object. The servant can perform simple tasks that a human servant could do, such as fetching things, cleaning, mending, folding clothes, lighting fires, serving food, and pouring wine. Once you give the command, the servant performs the task to the best of its ability until it completes the task, then waits for your next command.

If you command the servant to perform a task that would move it more than 60 feet away from you, the spell ends.
By 13th level, you have learned enough about the workings of magic that you can improvise the use of items even when they are not intended for you. You ignore all class, race, and level requirements on the use of magic items.
"""
''Shapechanger.'' If the vampire isn’t in sunlight or running water, it can use its action to polymorph into a Tiny bat or a Medium cloud of mist, or back into its true form.

While in bat form, the vampire can’t speak, its walking speed is 5 feet, and it has a flying speed of 30 feet. Its statistics, other than its size and speed, are unchanged. Anything it is wearing transforms with it, but nothing it is carrying does. It reverts to its true form if it dies.

While in mist form, the vampire can’t take any actions, speak, or manipulate objects. It is weightless, has a flying speed of 20 feet, can hover, and can enter a hostile creature’s space and stop there. In addition, if air can pass through a space, the mist can do so without squeezing, and it can’t pass through water. It has advantage on Strength, Dexterity, and Constitution saving throws, and it is immune to all nonmagical damage, except the damage it takes from sunlight.
''Legendary Resistance (3/Day).'' If the vampire fails a saving throw, it can choose to succeed instead.
''Misty Escape.'' When it drops to <<hp 0>> outside its resting place, the vampire transforms into a cloud of mist (as in the Shapechanger trait) instead of falling unconscious, provided that it isn’t in sunlight or running water. If it can’t transform, it is destroyed.

While it has <<hp 0>> in mist form, it can’t revert to its vampire form, and it must reach its resting place within <<time 2h>> or be destroyed. Once in its resting place, it reverts to its vampire form. It is then [[Paralyzed]] until it regains at least <<hp 1>>. After spending <<time 1h>> in its resting place with <<hp 0>>, it regains <<heal 1>>.
''Regeneration.'' The vampire regains <<heal 20>> at the start of its turn if it has at least <<hp 1>> and isn’t in sunlight or running water. If the vampire takes <<radiant radiant>> or damage from holy water, this trait doesn’t function at the start of the vampire’s next turn.
''Spider Climb.'' The vampire can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Vampire Weaknesses.'' The vampire has the following flaws:
&nbsp;&nbsp;&nbsp;&nbsp;//Forbiddance.// The vampire can’t enter a residence without an invitation from one of the occupants.
&nbsp;&nbsp;&nbsp;&nbsp;//Harmed by Running Water.// The vampire takes <<acid 20>> if it ends its turn in running water.
&nbsp;&nbsp;&nbsp;&nbsp;//Stake to the Heart.// If a piercing weapon made of wood is driven into the vampire’s heart while the vampire is [[Incapacitated]] in its resting place, the vampire is [[Paralyzed]] until the stake is removed.
''Sunlight Hypersensitivity.'' The vampire takes <<radiant 20>> when it starts its turn in sunlight. While in sunlight, it has disadvantage on attack rolls and ability checks.
"""
<<fold "Vampire Warriors, Variant">>
<<fold "Vampire Spellcasters, Variant">>
<<divider>>
''Multiattack (Vampire Form Only).'' The vampire makes two attacks, only one of which can be a bite attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Unarmed Strike" +9>>|<<bludgeoning 1d8+4>> |<<reach 5>> |
|~|''Vampire Form Only.''<br/>Instead of dealing damage, the vampire can grapple the target (<<skillcheck Escape 18>>). |<|
| !<<melee Bite +9>>|<<piercing 1d6+4>> + <<necrotic 3d6>> |<<reach 5>><br/><<per>> [[Grappled]] by the vampire, [[Incapacitated]] or [[Restrained]] |
|~|The target’s hit point maximum is reduced by an amount equal to the necrotic damage taken, and the vampire regains hit points equal to that amount. The reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0. A humanoid slain in this way and then buried in the ground rises the following night as a vampire spawn under the vampire’s control. |<|
| !Charm|The vampire targets one humanoid it can see within <<range 30>> of it. If the target can see the vampire, the target must succeed on a <<save Wis 17>> against this magic or be charmed by the vampire. The [[Charmed]] target regards the vampire as a trusted friend to be heeded and protected. Although the target isn’t under the vampire’s control, it takes the vampire’s requests or actions in the most favorable way it can, and it is a willing target for the vampire’s bite attack.<br/>&nbsp;<br/>Each time the vampire or the vampire’s companions do anything harmful to the target, it can repeat the saving throw, ending the effect on itself on a success. Otherwise, the effect lasts <<time 24h>> or until the vampire is destroyed, is on a different plane of existence than the target, or takes a bonus action to end the effect. |<|
| !Children of the Night|''1/Day.''<br/>The vampire magically calls <<roll 2d4>> swarms of bats or rats, provided that the sun isn’t up. While outdoors, the vampire can call <<roll 3d6>> wolves instead. The called creatures arrive in <<roll "1d4 rounds">>, acting as allies of the vampire and obeying its spoken commands. The beasts remain for <<time 1h>>, until the vampire dies, or until the vampire dismisses them as a bonus action. |<|
| !<<action>> Legendary Actions (3/round) |<|<|
| !Move|The vampire moves up to its speed without provoking opportunity attacks. |<|
| !Unarmed Strike|The vampire makes one unarmed strike. |<|
| !Bite|''Costs 2 Actions.''<br/>The vampire makes one bite attack. |<|
"""
''Regeneration.'' The vampire regains <<heal 10>> at the start of its turn if it has at least <<hp 1>> and isn’t in sunlight or running water. If the vampire takes <<radiant radiant>> damage or damage from holy water, this trait doesn’t function at the start of the vampire’s next turn.
''Spider Climb.'' The vampire can climb difficult surfaces, including upside down on ceilings, without needing to make an ability check.
''Vampire Weaknesses.'' The vampire has the following flaws:
&nbsp;&nbsp;&nbsp;&nbsp;//Forbiddance.// The vampire can’t enter a residence without an invitation from one of the occupants.
&nbsp;&nbsp;&nbsp;&nbsp;//Harmed by Running Water.// The vampire takes <<acid 20>> when it ends its turn in running water.
&nbsp;&nbsp;&nbsp;&nbsp;//Stake to the Heart.// The vampire is destroyed if a piercing weapon made of wood is driven into its heart while it is [[Incapacitated]] in its resting place.
''Sunlight Hypersensitivity.'' The vampire takes <<radiant 20>> when it starts its turn in sunlight. While in sunlight, it has disadvantage on attack rolls and ability checks.
"""
<<divider>>
''Multiattack.'' The vampire makes two attacks, only one of which can be a bite attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claws +6>>|<<slashing 2d4+3>> |<<reach 5>> |
|~|Instead of dealing damage, the vampire can grapple the target (<<skillchek Escape 13>>). |<|
| !<<melee Bite +6>>|<<piercing 1d6+3>> + <<necrotic 2d6>> |<<reach 5>><br/>or <<per>> [[Grappled]] by the vampire, [[Incapacitated]], or [[Restrained]] |
|~|The target’s hit point maximum is reduced by an amount equal to the necrotic damage taken, and the vampire regains hit points equal to that amount. The reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0. |<|
Some vampires are practitioners of the arcane arts. A spellcaster vampire spellcaster has a challenge rating of 15 (13,000 XP) and the following trait:

"""
''Spellcasting.'' The vampire is a 9th-level spellcaster. Its spellcasting ability is Intelligence (<<save "Spell DC" 16>>, <<casted "Spell Attack" +8>>). The vampire has the following wizard spells prepared:
&nbsp;&nbsp;&nbsp;&nbsp;''Cantrips (at will):'' [[Mage Hand]], [[Prestidigitation]], [[Ray of Frost]]
&nbsp;&nbsp;&nbsp;&nbsp;''1st level (4 slots):'' [[Comprehend Languages]], [[Fog Cloud]], [[Sleep]]
&nbsp;&nbsp;&nbsp;&nbsp;''2nd level (3 slots):'' [[Detect Thoughts]], [[Gust of Wind]], [[Mirror Image]]
&nbsp;&nbsp;&nbsp;&nbsp;''3rd level (3 slots):'' [[Animate Dead]], [[Bestow Curse]], [[Nondetection]]
&nbsp;&nbsp;&nbsp;&nbsp;''4th level (3 slots):'' [[Blight]], [[Greater Invisibility]]
&nbsp;&nbsp;&nbsp;&nbsp;''5th level (1 slot):'' [[Dominate Person]]
"""
Some vampires have martial training and battlefield experience. A warrior vampire wearing plate armor (AC 18) and wielding a greatsword has a challenge rating of 15 (13,000 XP) and the following additional action options:

''Multiattack.'' The vampire makes two greatsword attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Greatsword +9>>|<<slashing 2d6+4>> |<<reach 5>> |
The touch of your shadow-wreathed hand can siphon force from others to heal your wounds. Make a melee spell attack against a creature within your reach. On a hit, the target takes 3d6 necrotic damage, and you regain hit points equal to half the amount of necrotic damage dealt. Until the spell ends, you can make the attack again on each of your turns as an action.
Starting at 14th level, you can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.
''Multiattack.'' The veteran makes two longsword attacks. If it has a shortsword drawn, it can also make a shortsword attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Longsword +5>>|<<slashing 1d8+3>><br/><<slashing 1d10+3>> |<<reach 5>> |
| !<<melee Shortsword +5>>|<<piercing 1d6+3>> |<<reach 5>> |
| !<<ranged "Heavy Crossbow" +3>>|<<piercing 1d10+1>> |<<range 100/400>> |
You unleash a string of insults laced with subtle enchantments at a creature you can see within range. If the target can hear you (thought it need not understand you), it must succeed on a Wisdom saving throw or take 1d4 psychic damage and have disadvantage on the next attack roll it makes before the end of its next turn.
When you roll a 20 on your attack roll with this magic weapon, the target takes an extra <<damage 7>> of the weapon’s type.
"""
''False Appearance.'' While the violet fungus remains motionless, it is indistinguishable from an ordinary fungus.
"""
<<divider>>
''Multiattack.'' The fungus makes <<roll 1d4>> ''Rotting Touch'' attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee "Rotting Touch" +2>>|<<necrotic 1d8>> |<<reach 10>> |
!! Types of Vision

|^!{{Darkvision, Sight||Link}} |{{Darkvision, Sight}} |
|^!{{Blindsight||Link}} |{{Blindsight}} |
|^!{{Truesight||Link}} |{{Truesight}} |
''Prerequisite:'' 15th level

You can cast arcane eye at will, without expending a spell slot.

''Prerequisite:'' Pact of the Chain feature

You can communicate telepathically with your familiar and perceive through your familiar’s senses as long as you are on the same plane of existence. Additionally, while perceiving through your familiar’s senses, you can also speak through your familiar in your own voice, even if your familiar is normally incapable of speech.

You can use your action to make a ranged attack against any number of creatures within 10 feet of a point you can see within your weapon’s range. You must have ammunition for each target, as normal, and you make a separate attack roll for each target.

You gain a +3 bonus to attack and damage rolls made with this magic weapon. In addition, the weapon ignores resistance to slashing damage.

When you attack a creature that has at least one head with this weapon and roll a 20 on the attack roll, you cut off one of the creature’s heads. The creature dies if it can’t survive without the lost head. A creature is immune to this effect if it is immune to slashing damage, doesn’t have or need a head, has legendary actions, or the DM decides that the creature is too big for its head to be cut off with this weapon. Such a creature instead takes an extra <<slashing 6d8>> from the hit.
"""
''Magic Resistance.'' The vrock has advantage on saving throws against spells and other magical effects.
"""
<<divider>>
''Multiattack.'' The vrock makes two attacks: one with its beak and one with its talons.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +6>>|<<piercing 2d6+3>> |<<reach 5>> |
| !<<melee Talons +6>>|<<slashing 2d10+3>> |<<reach 5>> |
| !Spores|''Recharge on 6''<br/>A <<sphere 15>> cloud of toxic spores extends out from the vrock. The spores spread around corners. Each creature in that area must succeed on a <<save Con 14>> or become [[Poisoned]]. While [[Poisoned]] in this way, a target takes <<poison 1d10>> damage at the start of each of its turns. A target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. Emptying a vial of holy water on the target also ends the effect on it. |<|
| !Stunning Screech|''1/Day''<br/>The vrock emits a horrific screech. Each creature within <<range 20>> of it that can hear it and that isn’t a demon must succeed on a <<save Con 14>> or be [[Stunned]] until the end of the vrock’s next turn. |<|
"""
''Keen Sight and Smell.'' The vulture has advantage on Wisdom (Perception) checks that rely on sight or smell.
''Pack Tactics.'' The vulture has advantage on an attack roll against a creature if at least one of the vulture’s allies is within 5 feet of the creature and the ally isn’t [[Incapacitated]].
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Beak +2>>|<<piercing 1d4>> |<<reach 5>> |
All creatures have a walking speed, simply called the monster's speed. Creatures that have no form of ground-based locomotion have a walking speed of 0 feet.
You create a wall of fire on a solid surface within range. You can make the wall up to 60 feet long, 20 feet high, and 1 foot thick, or a ringed wall up to 20 feet in diameter, 20 feet high, and 1 foot thick. The wall is opaque and lasts for the duration.

When the wall appears, each creature within its area must make a Dexterity saving throw. On a failed save, a creature takes 5d8 fire damage, or half as much damage on a successful save.

One side of the wall, selected by you when you cast this spell, deals 5d8 fire damage to each creature that ends its turn within 10 feet of that side or inside the wall. A creature takes the same damage when it enters the wall for the first time on a turn or ends its turn there. The other side of the wall deals no damage.
An invisible wall of force springs into existence at a point you choose within range.
The wall appears in any orientation you choose, as a horizontal or vertical barrier or at an angle. It can be free floating or resting on a solid surface. You can form it into a hemispherical dome or a sphere with a radius of up to 10 feet, or you can shape a flat surface made up of ten 10-foot-by-10-foot panels. Each panel must be continguous with another panel. In any form, the wall is 1/4 inch thick. It lasts for the duration. If the wall cuts through a creature’s space when it appears, the creature is pushed to one side of the wall (your choice which side).

Nothing can physically pass through the wall. It is immune to all damage and can’t be dispelled by dispel magic. A disintegrate spell destroys the wall instantly, however.  The wall also extends into the Ethereal Plane, blocking ethereal travel through the wall.
You create a wall of ice on a solid surface within range. You can form it into a hemispherical dome or a sphere with radius of up to 10 feet, or you can shape a flat surfcae made up of ten 10-foot-square panels. Each panel must be contiguous with another panel. In any form, the wall is 1 foot thick and lasts for the duration.

If the wall cuts through a creature’s space when it appears, the creature within its area is pushed to one side of the wall and must make a Dexterity saving throw. On a failed save, the creature takes 10d6 cold damage, or half as much damage on a successful save.

The wall is an object that can be damaged and thus breached. It has AC 12 and 30 hit points per 10-foot section, and it is vulnerable to fire damage. Reducing a 10-foot section of wall to 0 hit points destroys it and leaves behind a sheet of frigid air int he space the wall occupied. A creature moving through the sheet of frigid air for the first time on a turn must make a Constitution saaving throw. The creature takes 5f6 cold damage on a failed save, or half as much damage on a successful one.
A nonmagical wall of solid stone springs into existence at a point you choose within range.
The wall is 6 inches thick and is composed of ten 10-foot-by-10-foot panels. Each panel must be contiguous with at least on other panel. Alternatively, you can create 10-foot-by-20-foot panels that are only 3 inches thick.

If the wall cuts through a creature’s space when it appears, the creature is pushed to one side of the wall (your choice). If a creature would be surrounded on all sides by the wall (or the wall and another solid surface), that creature can make a Dexterity saving throw. On a success, it can use its reaction to move up to its speed so that it is no longer enclosed by the wall.

The wall can have any shape you desire, though it can’t occupy the same space as a creature or object. the wall doesn’t need to be vertical or resting on any firm foundation. It must, however, merge with and be solidly supported by existing stone. Thus you can use this spell to bridge a chasm or create a ramp.

If you create a span greater than 20 feet in length, you must halve the size of each panel to create supports. You can crudely shape the wall to create crenellations, battlements, and so on.

The wall is an object made of stone that can be damaged and thus breached. Each panel has AC 15 and 30 hit points per inch of thickness. Reducing a panel to 0 hit points destroys it and might cause connected panels to collapse at the DM’s discretion.

If you maintain your concentration on this spell for its whole duration, the wall becomes permanent and can’t be dispelled. Otherwise, the wall disappears when the spell ends.
You create a wall of tough, pliable, tangled brush bristling with needle-sharp thorns. The wall appears within range on a solid surface and lasts for the duration. You choose to make the wall up to 60 feet long, 10 feet high, and 5 feet thick or a circle that has a 20-foot diameter and is up to 20 feet high and 5  feet thick. The wall blocks line of sight.

When the wall appears, each creature within its area must make a Dexterity saving throw. On a failed save, a creature takes 7d8 piercing damage, or half as much damage on a successful save.

A creature can move through the wall, albeit slowly and painfully. For every 1 foot a creature moves through the wall, it must spend 4 feet of movement. Furthermore, the first time a creature enters the wall on a turn or ends its turn there, the creature must make a Dexterity saving throw. It takes 7d8 slashing damage on a failed save, or half as much on a successful save.
This wand has 7 charges for the following properties. It regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.

''Spells.'' While holding the wand, you can use an action to expend some of its charges to cast one of the following spells (<<save "Spell DC" 17>>): [[Hold Monster]] (5 charges) or [[Hold Person]] (2 charges).

''Assisted Escape.'' While holding the wand, you can use your reaction to expend 1 charge and gain advantage on a saving throw you make to avoid being [[Paralyzed]] or [[Restrained]], or you can expend 1 charge and gain advantage on any check you make to escape a grapple.
This wand has 7 charges. While holding it, you can use an action and expend 1 charge to speak its command word. For the next minute, you know the direction of the nearest creature hostile to you within 60 feet, but not its distance from you. The wand can sense the presence of hostile creatures that are ethereal, invisible, disguised, or hidden, as well as those in plain sight. The effect ends if you stop holding the wand.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 7 charges for the following properties. It regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.

''Command.'' While holding the wand, you can use an action to expend 1 charge and command another creature to flee or grovel, as with the [[Command]] spell (<<save "Spell DC" 15>>).

''Cone of Fear.'' While holding the wand, you can use an action to expend 2 charges, causing the wand’s tip to emit a <<cone 60>> of amber light. Each creature in the cone must succeed on a <<save Wis 15>> or become [[Frightened]] of you for <<time 1m>>. While it is [[Frightened]] in this way, a creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If it has nowhere it can move, the creature can use the Dodge action. At the end of each of its turns, a creature can repeat the saving throw, ending the effect on itself on a success.
This wand has 7 charges. While holding it, you can use an action to expend 1 or more of its charges to cast the [[Fireball]] spell (<<save "Spell DC" 15>>) from it. For 1 charge, you cast the 3rd-level version of the spell. You can increase the spell slot level by one for each additional charge you expend.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 7 charges. While holding it, you can use an action to expend 1 or more of its charges to cast the [[Lightning Bolt]] spell (<<save "Spell DC" 15>>) from it. For 1 charge, you cast the 3rd-level version of the spell. You can increase the spell slot level by one for each additional charge you expend.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 3 charges. While holding it, you can expend 1 charge as an action to cast the [[Detect Magic]] spell from it. The wand regains <<roll 1d3>> expended charges daily at dawn.
This wand has 7 charges. While holding it, you can use an action to expend 1 or more of its charges to cast the [[Magic Missile]] spell from it. For 1 charge, you cast the 1st-level version of the spell. You can increase the spell slot level by one for each additional charge you expend.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 7 charges. While holding it, you can use an action to expend 1 of its charges to cause a thin blue ray to streak from the tip toward a creature you can see within 60 feet of you. The target must succeed on a <<save Con 15>> or be [[Paralyzed]] for <<time 1m>>. At the end of each of the target’s turns, it can repeat the saving throw, ending the effect on itself on a success.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 7 charges. While holding it, you can use an action to expend 1 of its charges to cast the [[Polymorph]] spell (<<save "Spell DC" 15>>) from it.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
The wand has 3 charges. While holding it, you can use an action to expend 1 of its charges, and if a secret door or trap is within 30 feet of you, the wand pulses and points at the one nearest to you. The wand regains <<roll 1d3>> expended charges daily at dawn.
While holding this wand, you gain a bonus to spell attack rolls determined by the wand’s rarity. In addition, you ignore half cover when making a spell attack.
While holding this wand, you gain a +1 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.
While holding this wand, you gain a +2 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.
While holding this wand, you gain a +3 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.
This wand has 7 charges. While holding it, you can use an action to expend 1 of its charges to cast the [[Web]] spell (<<save "Spell DC" 15>>) from it.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into ashes and is destroyed.
This wand has 7 charges. While holding it, you can use an action to expend 1 of its charges and choose a target within 120 feet of you. The target can be a creature, an object, or a point in space. Roll <<roll d100>> and consult the following table to discover what happens.

If the effect causes you to cast a spell from the wand, the spell’s <<save "Spell DC" 15>>. If the spell normally has a range expressed in feet, its range becomes 120 feet if it isn’t already.

If an effect covers an area, you must center the spell on and include the target. If an effect has multiple possible subjects, the DM randomly determines which ones are affected.

The wand regains <<roll 1d6+1>> expended charges daily at dawn. If you expend the wand’s last charge, roll a <<roll d20>>. On a 1, the wand crumbles into dust and is destroyed.

|max top|k
| !d100 | !Effect |
| !01–05 |You cast [[Slow]]. |
| !06–10 |You cast [[Faerie Fire]]. |
| !11–15 |You are [[Stunned]] until the start of your next turn, believing something awesome just happened. |
| !16–20 |You cast [[Gust of Wind]]. |
| !21–25 |You cast [[Detect Thoughts]] on the target you chose. If you didn’t target a creature, you instead take <<psychic 1d6>>. |
| !26–30 |You cast [[Stinking Cloud]]. |
| !31–33 |Heavy rain falls in a <<circle 60>> centered on the target. The area becomes [[Lightly Obscured]]. The rain falls until the start of your next turn. |
| !34–36 |An animal appears in the unoccupied space nearest the target. The animal isn’t under your control and acts as it normally would. Roll a <<roll d100>> to determine which animal appears. On a 01–25, a <<mob Rhinoceros>> appears; on a 26–50, an <<mob Elephant>> appears; and on a 51–100, a <<mob Rat>> appears. See the Monster Manual for the animal’s statistics. |
| !37–46 |You cast [[Lightning Bolt]]. |
| !47–49 |A cloud of 600 oversized butterflies fills a <<sphere 30>> centered on the target. The area becomes [[Heavily Obscured]]. The butterflies remain for <<time 10>>. |
| !50–53 |You enlarge the target as if you had cast [[Enlarge/Reduce]]. If the target can’t be affected by that spell, or if you didn’t target a creature, you become the target. |
| !54–58 |You cast [[Darkness]]. |
| !59–62 |Grass grows on the ground in a <<circle 60>> centered on the target. If grass is already there, it grows to ten times its normal size and remains overgrown for <<time 1m>>. |
| !63–65 |An object of the DM’s choice disappears into the Ethereal Plane. The object must be neither worn nor carried, within 120 feet of the target, and no larger than 10 feet in any dimension. |
| !66–69 |You shrink yourself as if you had cast [[Enlarge/Reduce]] on yourself. |
| !70–79 |You cast [[Fireball]]. |
| !80–84 |You cast [[Invisibility]] on yourself. |
| !85–87 |Leaves grow from the target. If you chose a point in space as the target, leaves sprout from the creature nearest to that point. Unless they are picked off, the leaves turn brown and fall off after <<time 24h>>. |
| !88–90 |A stream of <<roll 1d4x10>> gems, each worth 1 gp, shoots from the wand’s tip in a <<line 30>> and 5 feet wide. Each gem deals <<bludgeoning 1>>, and the total damage of the gems is divided equally among all creatures in the line. |
| !91–95 |A burst of colorful shimmering light extends from you in a <<sphere 30>>. You and each creature in the area that can see must succeed on a <<save Con 15>> or become [[Blinded]] for <<time 1m>>. A creature can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. |
| !96–97 |The target’s skin turns bright blue for <<roll 1d10>> days. If you chose a point in space, the creature nearest to that point is affected. |
| !98–00 |If you targeted a creature, it must make a <<save Con 15>>. If you didn’t target a creature, you become the target and must make the saving throw. If the saving throw fails by 5 or more, the target is instantly [[Petrified]]. On any other failed save, the target is [[Restrained]] and begins to turn to stone. While [[Restrained]] in this way, the target must repeat the saving throw at the end of its next turn, becoming [[Petrified]] on a failure or ending the effect on a success. The petrification lasts until the target is freed by the [[Greater Restoration]] spell or similar magic. |
This spell wards a willing creature you touch and creates a mystic connection between you and the target until the spell ends.

While the target is within 60 feet of you, it gains a +1 bonus to AC and saving throws, and it has resistance to all damage. Also, each time it takes damage, you take the same amount of damage.

The spell ends if you drop to 0 hit points or if you and the target become separated by more than 60 feet. It also ends if the spell is cast again on either of the connected creatures. You can also dismiss the spell as an action.
"""
''Trampling Charge.'' If the horse moves at least 20 feet straight toward a creature and then hits it with a hooves attack on the same turn, that target must succeed on a <<save Str 14>> or be knocked [[Prone]]. If the target is prone, the horse can make another attack with its hooves against it as a bonus action.
"""
<<fold "Warhorse Armor, Variant">>
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +6>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
An armored warhorse has an AC based on the type of barding worn (see the Player’s Handbook for more information on barding). The horse’s AC includes its Dexterity modifier, where applicable. Barding doesn’t alter the horse’s challenge rating.

|max|k
| !AC | !Barding | !AC | !Barding |
| 12 |Leather | 16 |Chain mail |
| 13 |Studded leather | 17 |Splint |
| 14 |Ring mail | 18 |Plate |
| 15 |Scale mail | |<|
|max top|k
| !<<action>> Actions |<|<|
| !<<melee Hooves +6>>|<<bludgeoning 2d6+4>> |<<reach 5>> |
As a warlock, you gain the following class features.

!! Hit Points

"""
''Hit Dice:'' 1d8 per warlock level
''Hit Points at 1st Level:'' 8 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d8 (or 5) + your Constitution modifier per warlock level after 1st
"""

!! Proficiencies

"""
''Armor:'' Light armor
''Weapons:'' Simple weapons
''Tools:'' None
''Saving Throws:'' Wisdom, Charisma
''Skills:'' Choose two skills from Arcana, Deception, History, Intimidation, Investigation, Nature, and Religion
"""

!! Equipment
You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a light crossbow and 20 bolts or (b) any simple weapon
(a) a component pouch or (b) an arcane focus
(a) a scholar’s pack or (b) a dungeoneer’s pack
Leather armor, any simple weapon, and two daggers
"""

!! Subclasses

<<list-box "[tag[Warlock]tag[Subclass]sort[]]">>

<<include "Warlock Advancement Table">>

---

<<include "Warlock Ability">>
<<sections-vertical "[[Pact Magic]] [[Eldritch Invocations]] [[Pact Boon]] [[Warlock Ability Score Improvement]] [[Eldritch Versatility]] [[Mystic Arcanum (6th level)]] [[Mystic Arcanum (7th level)]] [[Mystic Arcanum (8th level)]] [[Mystic Arcanum (9th level)]] [[Eldritch Master]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.

---

<<include "Eldritch Versatility">>
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !Spells Known | !Spell Slots | !Slot Level | !Invocations Known |
| !1st | +2 |[[Pact Magic]] | 2 | 2 | 1 | 1st | — |
| !2nd | +2 |[[Eldritch Invocations]] | 2 | 3 | 2 | 1st | 2 |
| !3rd | +2 |[[Pact Boon]] ([[Blade|Pact of the Blade]] / [[Chain|Pact of the Chain]] / [[Tome|Pact of the Tome]]) | 2 | 4 | 2 | 2nd | 2 |
| !4th | +2 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 3 | 5 | 2 | 2nd | 2 |
| !5th | +3 |— | 3 | 6 | 2 | 3rd | 3 |
| !6th | +3 | | 3 | 7 | 2 | 3rd | 3 |
| !7th | +3 |— | 3 | 8 | 2 | 4th | 4 |
| !8th | +3 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 3 | 9 | 2 | 4th | 4 |
| !9th | +4 |— | 3 | 10 | 2 | 5th | 5 |
| !10th | +4 | | 4 | 10 | 2 | 5th | 5 |
| !11th | +4 |[[Mystic Arcanum (6th level)]] | 4 | 11 | 3 | 5th | 5 |
| !12th | +4 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 11 | 3 | 5th | 6 |
| !13th | +5 |[[Mystic Arcanum (7th level)]] | 4 | 12 | 3 | 5th | 6 |
| !14th | +5 | | 4 | 12 | 3 | 5th | 6 |
| !15th | +5 |[[Mystic Arcanum (8th level)]] | 4 | 13 | 3 | 5th | 7 |
| !16th | +5 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 13 | 3 | 5th | 7 |
| !17th | +6 |[[Mystic Arcanum (9th level)]] | 4 | 14 | 4 | 5th | 7 |
| !18th | +6 |— | 4 | 14 | 4 | 5th | 8 |
| !19th | +6 |[[Ability Score Improvement|Warlock Ability Score Improvement]] | 4 | 15 | 4 | 5th | 8 |
| !20th | +6 |[[Eldritch Master]] | 4 | 15 | 4 | 5th | 8 |

<<spelltable "[[Blade Ward]] [[Booming Blade]] [[Chill Touch]] [[Create Bonfire]] [[Eldritch Blast]] [[Friends]] [[Frostbite]] [[Green-Flame Blade]] [[Infestation]] [[Lightning Lure]] [[Mage Hand]] [[Magic Stone]] [[Mind Silver]] [[Minor Illusion]] [[Poison Spray]] [[Prestidigitation]] [[Sword Burst]] [[Thunderclap]] [[Toll the Dead]] [[True Strike]]">>

<<htabs "[tag[Warlock Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAEBAf///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsOi8fkKaCMBp7T7N26Dbe94/TYvI5n3fP8074PKPIXSNgxWIiIcZjIOAGw2BjZ8ChZ6QhpmUmZycmw2Ql68BkKOkrKaXpqmaoa+YjZGvgaq8lKizh7K5mr28jbm/gLXCg8LGtrnFeczLfMjPcK+4wWPd0XLW0thq2tXN1dxw1Oh509zlV+3lZuro7F7p4GH1/G3k5vNo8PZn+//+IPQr8RAf95KjjJniCEBhUgU6QQhLOGFyZWHOjBIsX+Ct8MYeTQcSNIjRL6PbxEUmTJkBA/ZhCnciRLCyYZpovpcSaFmgX14dTgk2PNljp/0gy6cujRm0Y3RBTqEiXTpi+fLk25ICrVi1ZpAtW69epUPWDD7jTpAq3ZnGP9IF37AaZbrHAzpmBYN68mvfn+4OV716HcACcBzxillnBhwwB5KmVcw7FkyDQkW/5LWexlnpnJbr7cGcXn0YtDaya92TRb1KxLm24N+7PqBLFrT54tirRi27dx705N23Fw2b5/gz7YNjdx1agfDBY8+jVr50URTGdcmzrJ7IBbC3w+XHfm5g7eWicfOnr55OeXM3cPvboB+LiBJ5Rv/HHx9pz+12s8vl98iSF3Um8BEliWcpAId6B2Cc5XoH4N+vfgfwNO+F1XDjloHob3dUgYhSB6iCB4GY5I4oco8sdeihFIWKKJLiZ1IYQwzggVbzjKxN2OTtnmo0T0BRmCgUSW0N+Roj2oZJEtNomka1AKidmUQllZkhsk0qUCfulxeZeXkK3Y5ZNjkhmmmd1paAeTddV4mJtm3XiWjFKpuRWdJ+q5p515wvmifTmiKZKeDwkKXYx+xmRoUYgqeAifOAFq40yPgkjpT0xGBWB+FrKpKagsygWgpHJS5OaAlo26qKiMonjhqqym5OpGtVY6lqyQLoqrlPiQWaORnpZG6K+89rr+jLCnekoVnrsmm+Ss5jhrLJigMiigmLsadeysipq4LK7cavssMtGGR66C4/o6rIgd3poVmOCkW667dsIbb5XAyIssh2YWq9ykPf2babtcqcQuq316CXBuCH/Fa8HMvvRlxPA2bF1nK55KbYDOctytx8cu23Fx3ZIcsm/UokxvfSfjK66PKcNsXJAzF9vybC3TXPOOO+Occ8Xs8vybz/wSHbTGRzfMb8VE5dy00gFhnDRlTWO824xRYx31mQOnHJzWCGGtmNgQV53weGOXLJiLNrEd9pZvg73hljx2PV+KeJGdt90/0o2lZoEvWfXggRZuuL+JR4n44iU6TlDjkAuTOPlCeFdOOeZxSa55z53f/flqoYM++tn6Yg546TGrzlXarBf9euuxyz57jrXbfrtUueu+++Gno+7665eXPvzoxYd+/OfJd7685s0D/zv0vSc1/eHVB3r9d9lTt/163Sf0/UHhxzt+2+Wfd37G6YuyPvvth/h+9M6/D3/78qNO//30789///7/D8AACnCABCxgCwoAADs=
This spell grants up to ten willing creatures you can see within range the ability to breathe underwater until the spell ends. Affected creatures also retain their normal mode of respiration.
"""
''Water Form.'' The elemental can enter a hostile creature's space and stop there. It can move through a space as narrow as 1 inch wide without squeezing.
''Freeze.'' If the elemental takes cold damage, it partially freezes; its speed is reduced by 20 feet until the end of its next turn.
"""
<<divider>>
''Multiattack.'' The elemental makes two slam attacks.

|max|k
| !<<action>> Actions |<|<|
| !<<melee Slam +7>>|<<bludgeoning 2d8+4>> |<<reach 5>> |
|^ !Whelm|''Recharge on 4-6''<br/>Each creature in the elemental's space must make a <<save Str 15>>. On a failure, a target takes <<bludgeoning 2d8+4>>. If it is Large or smaller, it is also [[Grappled]], <<skillcheck Escape 14>>. Until this grapple ends, the target is [[Restrained]] and ''unable to breathe'' unless it can breathe water. If the saving throw is successful, the target is pushed out of the elemental's space. |<|
This spell grants the ability to move across any liquid surface – such as water, acid, mud, snow, quicksand, or lava – as if it were harmless solid ground (creatures crossing molten lava can still take damage from the heat).
Up to ten willing creatures you can see within range gain this ability for the duration.

If you target a creature submerged in a liquid, the spell carries the target to the surface of the liquid at a rate of 60 feet per round.
Monks of the Way of the Open Hand are the ultimate masters of martial arts combat, whether armed or unarmed. They learn techniques to push and trip their opponents, manipulate ki to heal damage to their bodies, and practice advanced meditation that can protect them from harm.

{{||MonkAdvancementTemplate}}
{{||ClassAbilityTemplate}}
| !Level | !Proficiency Bonus | !Martial Arts | !Ki Points | !Unarmored Movement | !Features |
| !1st | +2 | 1d4 | — | — |[[Unarmored Defense]], [[Martial Arts]] |
| !2nd | +2 | 1d4 | 2 | +10 ft. |[[Ki]], [[Unarmored Movement]] |
| !3rd | +2 | 1d4 | 3 | +10 ft. |[[Deflect Missiles]], ''Open Hand:'' [[Open Hand Technique]] |
| !4th | +2 | 1d4 | 4 | +10 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]], [[Slow Fall]] |
| !5th | +3 | 1d6 | 5 | +10 ft. |[[Extra Attack|Monk Extra Attack]], [[Stunning Strike]] |
| !6th | +3 | 1d6 | 6 | +15 ft. |[[Ki-Empowered Strikes]], ''Open Hand:'' [[Wholeness of Body]] |
| !7th | +3 | 1d6 | 7 | +15 ft. |[[Evasion|Monk Evasion]], [[Stillness of Mind]] |
| !8th | +3 | 1d6 | 8 | +15 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !9th | +4 | 1d6 | 9 | +15 ft. |[[Unarmored Movement Improvement]] |
| !10th | +4 | 1d6 | 10 | +20 ft. |[[Purity of Body]] |
| !11th | +4 | 1d8 | 11 | +20 ft. |''Open Hand:'' [[Tranquility]]|
| !12th | +4 | 1d8 | 12 | +20 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !13th | +5 | 1d8 | 13 | +20 ft. |[[Tongue of the Sun and Moon]] |
| !14th | +5 | 1d8 | 14 | +25 ft. |[[Diamond Soul]] |
| !15th | +5 | 1d8 | 15 | +25 ft. |[[Timeless Body|Monk Timeless Body]] |
| !16th | +5 | 1d8 | 16 | +25 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !17th | +6 | 1d10 | 17 | +25 ft. |''Open Hand:'' [[Quivering Palm]] |
| !18th | +6 | 1d10 | 18 | +30 ft. |[[Empty Body]] |
| !19th | +6 | 1d10 | 19 | +30 ft. |[[Ability Score Improvement|Monk Ability Score Improvement]] |
| !20th | +6 | 1d10 | 20 | +30 ft. |[[Perfect Self]] |
|max|k
| !Name | !Cost | !Damage | !Weight | !Properties |
| !Simple Melee Weapons |<|<|<|<|
|!Club | 1 sp | <<bludgeoning 1d4>>  | 2 lb. |[[Light|Light Property]] |
|!Dagger | 2 gp | <<piercing 1d4>>  | 1 Ib. |[[Finesse]], [[Light|Light Property]], [[Thrown]] (range 20/60) |
|!Greatclub | 2 sp | <<bludgeoning 1d8>>  | 10 lb. |[[Two-Handed]] |
|!Handaxe | 5 gp | <<slashing 1d6>>  | 2 lb. |[[Light|Light Property]], [[Thrown]] (range 20/60) |
|!Javelin | 5 sp | <<piercing 1d6>> | 2 lb. |[[Thrown]] (range 30/120) |
|!Light Hammer | 2 gp | <<bludgeoning 1d4>> | 2 lb. |[[Light|Light Property]], [[Thrown]] (range 20/60) |
|!Mace | 5 gp | <<bludgeoning 1d6>> | 4 lb. |&mdash; |
|!Quarterstaff | 2 sp | <<bludgeoning 1d6>> | 4 lb. |[[Versatile]] (1d8) |
|!Sickle | 1 gp | <<slashing 1d4>> | 2 lb. |[[Light|Light Property]] |
|!Spear | 1 gp | <<piercing 1d6>> | 3 Ib. |[[Thrown]] (range 20/60), [[Versatile]] (ld8) |
|!Unarmed Strike | &mdash; | <<bludgeoning 1>> | &mdash; |&mdash; |
| !Simple Ranged Weapons |<|<|<|<|
|!Crossbow, Light | 25 gp | <<piercing 1d8>> | 5 lb. |[[Ammunition]] (range 80/320), [[Loading]], [[Two-Handed]] |
|!Dart | 5 cp | <<piercing 1d4>> | 1/4 Ib. |[[Finesse]], [[Thrown]] (range 20/60) |
|!Shortbow | 25 gp | <<piercing 1d6>> | 2 lb. |[[Ammunition]] (range 80/320), [[Two-Handed]] |
|!Sling | 1 sp | <<bludgeoning 1d4>> | &mdash; |[[Ammunition]] (range 30/120) |
| !Martia! Melee Weapons |<|<|<|<|
|!Battleaxe | 10 gp | <<slashing 1d8>> | 4 lb. |[[Versatile]] (1d10) |
|!Flail | 10 gp | <<bludgeoning 1d8>> | 2 lb. |&mdash; |
|!Glaive | 20 gp | <<slashing 1d10>> | 6 lb. |[[Heavy]], [[Reach]], [[Two-Handed]] |
|!Greataxe | 30 gp | <<slashing 1d12>> | 7 lb. |[[Heavy]], [[Two-Handed]] |
|!Greatsword | 50 gp | <<slashing 2d6>> | 6 lb. |[[Heavy]], [[Two-Handed]] |
|!Halberd | 20 gp | <<slashing 1d10>> | 6 lb. |[[Heavy]], [[Reach]], [[Two-Handed]] |
|!Lance | 10 gp | <<piercing 1d12>> | 6 lb. |[[Reach]], [[Special]] |
|!Longsword | 15 gp | <<slashing 1d8>> | 3 lb. |[[Versatile]] (1d10) |
|!Maul | 10 gp | <<bludgeoning 2d6>> | 10 lb. |[[Heavy]], [[Two-Handed]] |
|!Morningstar | 15 gp | <<piercing 1d8>> | 4 lb. |&mdash; |
|!Pike | 5 gp | <<piercing 1d10>> | 18 lb. |[[Heavy]], [[Reach]], [[Two-Handed]] |
|!Rapier | 25 gp | <<piercing 1d8>> | 2 lb. |[[Finesse]] |
|!Scimitar | 25 gp | <<slashing 1d6>> | 3 lb. |[[Finesse]], [[Light]] |
|!Shortsword | 10 gp | <<piercing 1d6>> | 2 lb. |[[Finesse]], [[Light]] |
|!Trident | 5 gp | <<slashing 1d6>> | 4 lb. |[[Thrown]] (range 20/60), [[Versatile]] (1d8) |
|!War Pick | 5 gp | <<piercing 1d8>> | 2 lb. |&mdash; |
|!Warhammer | 15 gp | <<bludgeoning 1d8>> | 2 lb. |[[Versatile]] (1d10) |
|!Whip | 2 gp | <<slashing 1d4>> | 3 lb. |[[Finesse]], reach |
| !Martial Ranged Weapons |<|<|<|<|
|!Blowgun | 10 gp | <<piercing 1>> | 1 lb. |[[Ammunition]] (range 25/100), loading |
|!Crossbow, hand | 75 gp | <<piercing 1d6>> | 3 lb. |[[Ammunition]] (range 30/120), [[Light||Light Property]], loading |
|!Crossbow, heavy | 50 gp | <<piercing 1d10>> | 18 lb. |[[Ammunition]] (range 100/400), [[Heavy]], [[Loading]], [[Two-Handed]] |
|!Longbow | 50 gp | <<piercing 1d8>> | 2 lb. |[[Ammunition]] (range 150/600) |
|!Net | 1 gp | &mdash; | 3 lb. |[[Special]], [[Thrown]] (range 5/15) |
You have a +1 bonus to attack and damage rolls made with this magic weapon.
You have a +2 bonus to attack and damage rolls made with this magic weapon.
You have a +3 bonus to attack and damage rolls made with this magic weapon.
You have a bonus to attack and damage rolls made with this magic weapon. The bonus is determined by the weapon’s rarity.
"""
''Keen Hearing and Smell.'' The weasel has advantage on Wisdom (Perception) checks that rely on hearing or smell.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>>|<<piercing 1>> |<<reach 5>> |
| !d20 | !Temperature |
| !1-14 |Normal weather for the season |
| !15-17 |1d4 x 10 degrees F colder than normal |
| !18-20 |1d4 x 10 degrees F hotter than normal |

| !d20 | !Wind | !Precipitation |
| !1-12 |None |None |
| !13-17 |Light |Light rain or light snowfall |
| !18-20 |Strong |Heavy rain or heavy snowfall |

| !Day | !d20 | !d20 | !d20 |!Temperature | !Wind | !Precipitation |
| !1 | 4 | 4 | 1 | &mdash; | &mdash; | &mdash; |
| !2 | 16 | 14 | 20 | -30 | Light | Heavy |
| !3 | 6 | 12 | 11 | &mdash; | &mdash; | &mdash; |
| !4 | 17 | 13 | 15 | -40 | Light | Light |
| !5 | 18 | 3 | 19 | +20 | &mdash; | Heavy |
| !6 | 20 | 10 | 10 | +10 | &mdash; | &mdash; |
| !7 | 1 | 15 | 15 | &mdash; | Light | Light |
| !8 | 5 | 2 | 14 | &mdash; | &mdash; | Light |
| !9 | 10 | 7 | 7 | &mdash; | &mdash; | &mdash; |
| !10 | 9 | 14 | 4 | &mdash; | Light | &mdash; |
| !11 | 3 | 10 | 8 | &mdash; | &mdash; | &mdash; |
| !12 | 19 | 20 | 11 | +10 | Strong | &mdash; |
| !13 | 15 | 7 | 14 | -10 | &mdash; | Light |
| !14 | 3 | 18 | 2 | &mdash; | Strong | &mdash; |
| !15 | 4 | 10 | 4 | &mdash; | &mdash; | &mdash; |
| !16 | 5 | 10 | 19 | &mdash; | &mdash; | Heavy |
| !17 | 15 | 10 | 9 | -40 | &mdash; | &mdash; |
| !18 | 5 | 5 | 15 | &mdash; | &mdash; | Light |
| !19 | 14 | 12 | 6 | &mdash; | &mdash; | &mdash; |
| !20 | 9 | 15 | 5 | &mdash; | Light | &mdash; |
| !21 | 7 | 5 | 5 | &mdash; | &mdash; | &mdash; |
| !22 | 2 | 20 | 17 | &mdash; | Strong | Light |
| !23 | 14 | 13 | 9 | &mdash; | Light | &mdash; |
| !24 | 13 | 15 | 6 | &mdash; | Light | &mdash; |
| !25 | 1 | 1 | 14 | &mdash; | &mdash; | Light |
| !26 | 14 | 17 | 2 | &mdash; | Light | &mdash; |
| !27 | 2 | 17 | 9 | &mdash; | Light | &mdash; |
| !28 | 13 | 20 | 4 | &mdash; | Strong | &mdash; |
| !29 | 9 | 16 | 17 | &mdash; | Light | Light |
| !30 | 1 | 9 | 4 | &mdash; | &mdash; | &mdash; |
Weaver’s tools allow you to create cloth and tailor it into articles of clothing.

''Components.'' Weaver’s tools include:

* thread
* needles
* scraps of cloth

You know how to work a loom, but such equipment is too large to transport.

''Arcana, History.'' Your expertise lends you additional insight when examining cloth objects, including cloaks and robes.

''Investigation.'' Using your knowledge of the process of creating cloth objects, you can spot clues and make deductions that others would overlook when you examine tapestries, upholstery, clothing, and other woven items.

''Repair.'' As part of a short rest, you can repair a single damaged cloth object.

''Craft Clothing.'' Assuming you have access to sufficient cloth and thread, you can create an outfit for a creature as part of a long rest.

| !Activity | !DC |
|!Repurpose cloth | 10 |
|!Mend a hole in a piece of cloth | 10 |
|!Tailor an outfit | 15 |
You conjure a mass of thick, sticky webbing at a point of your choice within range.
The webs fill a 20-foot cube from that point for the duration. The webs are difficult terrain and lightly obscure their area.

If the webs aren’t anchored between two solid masses (such as walls or trees) or layered across a floor, wall, or ceiling, the conjured web collapses on itself, and the spell ends at the start of your next turn. Webs layered over a flat surface have a depth of 5 feet.

Each creature that starts its turn in the webs or that enters them during its turn must make a Dexterity saving throw. On a failed save, the creature is [[Restrained]] as long as it remains in the webs or until it breaks free.

A creature [[Restrained]] by the webs can use its action to make a Strength check against your spell save DC. If it succeeds, it is no longer [[Restrained]].

The webs are flammable. Any 5-foot cube of webs exposed to fire burns away in 1 round, dealing 2d4 fire damage to any creature that starts its turn in the fire.
Drawing on the deepest fears of a group of creatures, you create illusory creatures in their minds, visible only to them.
Each creature in a 30-foot-radius sphere centered on a point of your choice within range must make a Wisdom saving throw. On a failed save, a creature becomes frightened for the duration.
The illusion calls on the creature’s deepest fears, manifesting its worst nightmares as an implacable threat. At the end of each of the frightened creature’s turns, it must succeed on a Wisdom saving throw or take 4d10 psychic damage. On a successful save, the spell ends for that creature.
This fine black cloth, soft as silk, is folded up to the dimensions of a handkerchief. It unfolds into a circular sheet 6 feet in diameter.

You can use an action to unfold and place the well of many worlds on a solid surface, whereupon it creates a two-way portal to another world or plane of existence. Each time the item opens a portal, the DM decides where it leads. You can use an action to close an open portal by taking hold of the edges of the cloth and folding it up. Once well of many worlds has opened a portal, it can’t do so again for <<time "1d8 hours">>.
"""
''Shapechanger.'' The werebear can use its action to polymorph into a Large bear-humanoid hybrid or into a Large bear, or back into its true form, which is humanoid. Its statistics, other than its size and AC, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Keen Smell.'' The werebear has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack.'' In bear form, the werebear makes two claw attacks. In humanoid form, it makes two greataxe attacks. In hybrid form, it can attack like a bear or a humanoid.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>><br/>''Bear or Hybrid Form Only''|<<piercing 2d10+4>> |<<reach 5>> |
|~|If the target is a humanoid, it must succeed on a <<save Con 14>> or be cursed with werebear [[Lycanthropy]]. |<|
| !<<melee Claw +7>><br/>''Bear or Hybrid Form Only''|<<slashing 2d8+4>> |<<reach 5>> |
| !<<melee Greataxe +7>><br/>''Humanoid or Hybrid Form Only''|<<slashing 1d12+4>> |<<reach 5>> |
"""
''Shapechanger.'' The wereboar can use its action to polymorph into a boar-humanoid hybrid or into a boar, or back into its true form, which is humanoid. Its statistics, other than its AC, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Charge (Boar or Hybrid Form Only).'' If the wereboar moves at least 15 feet straight toward a target and then hits it with its tusks on the same turn, the target takes an extra <<slashing 2d6>>. If the target is a creature, it must succeed on a <<save Str 13>> or be knocked [[Prone]].
''Relentless (Recharges after a Short or Long Rest).'' If the wereboar takes 14 damage or less that would reduce it to 0 hit points, it is reduced to 1 hit point instead.
"""
<<divider>>
''Multiattack (Humanoid or Hybrid Form Only).'' The wereboar makes two attacks, only one of which can be with its tusks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Maul +5>><br/>''Humanoid or Hybrid Form Only''|<<bludgeoning 2d6+3>> |<<reach 5>> |
| !<<melee Tusks +5>><br/>''Boar or Hybrid Form Only''|<<slashing 2d6+3>> |<<reach 5>> |
|~|If the target is a humanoid, it must succeed on a <<save Con 12>> or be cursed with wereboar [[Lycanthropy]]. |<|


"""
''Shapechanger.'' The wererat can use its action to polymorph into a rat-humanoid hybrid or into a giant rat, or back into its true form, which is humanoid. Its statistics, other than its size, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Keen Smell.'' The wererat has advantage on Wisdom (Perception) checks that rely on smell.
"""
<<divider>>
''Multiattack (Humanoid or Hybrid Form Only).'' The wererat makes two attacks, only one of which can be a bite.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>><br/>''Rat or Hybrid Form Only''|<<piercing 1d4+2>> |<<reach 5>> |
|~|If the target is a humanoid, it must succeed on a <<save Con 11>> or be cursed with wererat [[Lycanthropy]]. |<|
| !<<melee Shortsword +4>><br/>''Humanoid or Hybrid Form Only''|<<piercing 1d6+2>> |<<reach 5>> |
| !<<ranged "Hand Crossbow" +4>><br/>''Humanoid or Hybrid Form Only''|<<piercing 1d6+2>> |<<range 30/120>> |
"""
''Shapechanger.'' The weretiger can use its action to polymorph into a tiger-humanoid hybrid or into a tiger, or back into its true form, which is humanoid. Its statistics, other than its size, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Keen Hearing and Smell.'' The weretiger has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pounce (Tiger or Hybrid Form Only).'' If the weretiger moves at least 15 feet straight toward a creature and then hits it with a claw attack on the same turn, that target must succeed on a <<save Str 14>> or be knocked [[Prone]]. If the target is [[Prone]], the weretiger can make one bite attack against it as a bonus action.
"""
<<divider>>
''Multiattack (Humanoid or Hybrid Form Only).'' In humanoid form, the weretiger makes two scimitar attacks or two longbow attacks. In hybrid form, it can attack like a humanoid or make two claw attacks.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +5>><br/>''Tiger or Hybrid Form Only''|<<piercing 1d10+3>> |<<reach 5>> |
|~|If the target is a humanoid, it must succeed on a <<save Con 13>> or be cursed with weretiger [[Lycanthropy]]. |<|
| !<<melee Claw +5>><br/>''Tiger or Hybrid Form Only''|<<slashing 1d8+3>> |<<reach 5>> |
| !<<melee Scimitar +5>><br/>''Humanoid or Hybrid Form Only''|<<slashing 1d6+2>> |<<reach 5>> |
| !<<ranged Longbow +4>><br/>''Humanoid or Hybrid Form Only''|<<piercing 1d8+2>> |<<range 150/600>> |
"""
''Shapechanger.'' The werewolf can use its action to polymorph into a wolf-humanoid hybrid or into a wolf, or back into its true form, which is humanoid. Its statistics, other than its AC, are the same in each form. Any equipment it is wearing or carrying isn’t transformed. It reverts to its true form if it dies.
''Keen Hearing and Smell.'' The werewolf has advantage on Wisdom (Perception) checks that rely on hearing or smell.
"""
<<divider>>
''Multiattack (Humanoid or Hybrid Form Only).'' The werewolf makes two attacks: two with its spear (humanoid form) or one with its bite and one with its claws (hybrid form).

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +4>><br/>''Wolf or Hybrid Form Only''|<<piercing 1d8+2>> |<<reach 5>> |
|~|If the target is a humanoid, it must succeed on a <<save Con 12>> or be cursed with werewolf [[Lycanthropy]]. |<|
| !<<melee Claws +5>><br/>''Wolf or Hybrid Form Only''|<<slashing 2d4+2>> |<<reach 5>> |
| !<<ranged Spear +4>><br/>''Humanoid or Hybrid Form Only''|<<piercing 1d6+2>><br/><<piercing 1d8+2>> (''Two-handed'') |<<reach 5>><br/><<range 20/60>> |
You can use your action to make a melee attack against any number of creatures within 5 feet of you, with a separate attack roll for each target.

''Prerequisite:'' 9th level

You can cast speak with dead at will, without expending a spell slot.
At 6th level, you gain the ability to heal yourself. As an action, you can regain hit points equal to three times your monk level. You must finish a long rest before you can use this feature again.
<<vtabs "[tag[Widget]sort[]]">>
"""
''Sunlight Sensitivity.'' While in sunlight, the wight has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>
''Multiattack.'' The wight makes two longsword attacks or two longbow attacks. It can use its Life Drain in place of one longsword attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Life Drain" +4>>|<<necrotic 1d6+2>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 13>> or its hit point maximum is reduced by an amount equal to the damage taken. This reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0.<br/>&nbsp;<br/>A humanoid slain by this attack rises <<time 24h>> later as a <<mob Zombie>> the wight’s control, unless the humanoid is restored to life or its body is destroyed. The wight can have no more than twelve zombies under its control at one time. |<|
| !<<melee Longsword +4>>|<<slashing 1d10+2>><br/><<slashing 1d10+2>> (''Two-handed'') |<<reach 5>> |
| !<<ranged Longbow +4>>|<<piercing 1d8+2>> |<<range 150/600>> |
"""
''Optional Class Feature''
"""

You gain the ability to summon a spirit that assumes an animal form: as an action, you can expend a use of your Wild Shape feature to cast the [[Find Familiar]] spell, without material components.

When you cast the spell in this way, the familiar is a fey instead of a beast, and the familiar disappears after a number of hours equal to half your druid level.
|max top|k
| !d100 |<| !Effect |
| !01 | !02 |Roll on this table at the start of each of your turns for the next minute, ignoring this result on subsequent rolls. |
| !03 | !04 |For the next minute, you can see any invisible creature if you have line of sight to it. |
| !05 | !06 |A [[Modron]] chosen and controlled by the DM appears in an unoccupied space within 5 feet of you, then disappears 1 minute later. |
| !07 | !08 |You cast [[Fireball]] as a 3rd-level spell centered on yourself. |
| !09 | !10 |You cast [[Magic Missile]] as a 5th-level spell. |
| !11 | !12 |Roll a d10. Your height changes by a number of inches equal to the roll. If the roll is odd, you shrink. If the roll is even, you grow. |
| !13 | !14 |You cast [[Confusion]] centered on yourself. |
| !15 | !16 |For the next minute, you regain 5 hit points at the start of each of your turns. |
| !17 | !18 |You grow a long beard made of feathers that remains until you sneeze, at which point the feathers explode out from your face. |
| !19 | !20 |You cast [[Grease]] centered on yourself. |
| !21 | !22 |Creatures have disadvantage on saving throws against the next spell you cast in the next minute that involves a saving throw. |
| !23 | !24 |Your skin turns a vibrant shade of blue. A remove curse spell can end this effect. |
| !25 | !26 |An eye appears on your forehead for the next minute. During that time, you have advantage on Wisdom (Perception) checks that rely on sight. |
| !27 | !28 |For the next minute, all your spells with a casting time of 1 action have a casting time of 1 bonus action. |
| !29 | !30 |You teleport up to 60 feet to an unoccupied space of your choice that you can see. |
| !31 | !32 |You are transported to the Astral Plane until the end of your next turn, after which time you return to the space you previously occupied or the nearest unoccupied space if that space is occupied. |
| !33 | !34 |Maximize the damage of the next damaging spell you cast within the next minute. |
| !35 | !36 |Roll a d10. Your age changes by a number of years equal to the roll. If the roll is odd, you get younger (minimum 1 year old). If the roll is even, you get older. |
| !37 | !38 |1d6 [[flumphs|Flumph]] controlled by the DM appear in unoccupied spaces within 60 feet of you and are frightened of you. They vanish after 1 minute. |
| !39 | !40 |You regain 2d10 hit points. |
| !41 | !42 |You turn into a potted plant until the start of your next turn. While a plant, you are [[Incapacitated]] and have vulnerability to all damage. If you drop to 0 hit points, your pot breaks, and your form reverts. |
| !43 | !44 |For the next minute, you can teleport up to 20 feet as a bonus action on each of your turns. |
| !45 | !46 |You cast [[Levitate]] on yourself. |
| !47 | !48 |A [[Unicorn]] controlled by the DM appears in a space within 5 feet of you, then disappears 1 minute later. |
| !49 | !50 |You can’t speak for the next minute. Whenever you try, pink bubbles float out of your mouth. |
| !51 | !52 |A spectral shield hovers near you for the next minute, granting you a +2 bonus to AC and immunity to [[Magic Missile]]. |
| !53 | !54 |You are immune to being Intoxicated by alcohol for the next 5d6 days. |
| !55 | !56 |Your hair falls out but grows back within 24 hours. |
| !57 | !58 |For the next minute, any flammable object you touch that isn’t being worn or carried by another creature bursts into flame. |
| !59 | !60 |You regain your lowest-level expended spell slot. |
| !61 | !62 |For the next minute, you must shout when you speak. |
| !63 | !64 |You cast [[Fog Cloud]] centered on yourself. |
| !65 | !66 |Up to three creatures you choose within 30 feet of you take 4d10 lightning damage. |
| !67 | !68 |You are [[Frightened]] by the nearest creature until the end of your next turn. |
| !69 | !70 |Each creature within 30 feet of you becomes invisible for the next minute. The [[Invisibility]] ends on a creature when it attacks or casts a spell. |
| !71 | !72 |You gain resistance to all damage for the next minute. |
| !73 | !74 |A random creature within 60 feet of you becomes [[Poisoned]] for 1d4 hours. |
| !75 | !76 |You glow with bright light in a 30-foot radius for the next minute. Any creature that ends its turn within 5 feet of you is [[Blinded]] until the end of its next turn. |
| !77 | !78 |You cast [[Polymorph]] on yourself. If you fail the saving throw, you turn into a [[Sheep]] for the spell’s duration. |
| !79 | !80 |Illusory butterflies and flower petals flutter in the air within 10 feet of you for the next minute. |
| !81 | !82 |You can take one additional action immediately. |
| !83 | !84 |Each creature within 30 feet of you takes 1d10 necrotic damage. You regain hit points equal to the sum of the necrotic damage dealt. |
| !85 | !86 |You cast [[Mirror Image]]. |
| !87 | !88 |You cast [[Fly]] on a random creature within 60 feet of you. |
| !89 | !90 |You become invisible for the next minute. During that time, other creatures can’t hear you. The [[Invisibility]] ends if you attack or cast a spell. |
| !91 | !92 |If you die within the next minute, you immediately come back to life as if by the [[Reincarnate]] spell. |
| !93 | !94 |Your size increases by one size category for the next minute. |
| !95 | !96 |You and all creatures within 30 feet of you gain vulnerability to piercing damage for the next minute. |
| !97 | !98 |You are surrounded by faint, ethereal music for the next minute. |
| !99 | !00 |You regain all expended sorcery points. |
Starting at 2nd level, you can use your action to magically assume the shape of a beast that you have seen before. You can use this feature twice. You regain expended uses when you finish a short or long rest.

Your druid level determines the beasts you can transform into, as shown in the Beast Shapes table. At 2nd level, for example, you can transform into any beast that has a challenge rating of 1/4 or lower that doesn’t have a flying or swimming speed.

!! Beast Shapes

| !Level | !Max CR | !Limitations | !Example |
| !2nd | 1/4 |No flying or swimming speed |<<mob Wolf>> |
| !4th | 1/2 |No flying speed |<<mob Crocodile>> |
| !8th | 1 | — |<<mob "Giant Eagle">> |

You can stay in a beast shape for a number of hours equal to half your druid level (rounded down). You then revert to your normal form unless you expend another use of this feature. You can revert to your normal form earlier by using a bonus action on your turn. You automatically revert if you fall unconscious, drop to 0 hit points, or die.

While you are transformed, the following rules apply:

* Your game statistics are replaced by the statistics of the beast, but you retain your alignment, personality, and Intelligence, Wisdom, and Charisma scores. You also retain all of your skill and saving throw proficiencies, in addition to gaining those of the creature. If the creature has the same proficiency as you and the bonus in its stat block is higher than yours, use the creature’s bonus instead of yours. If the creature has any legendary or lair actions, you can’t use them.
* When you transform, you assume the beast’s hit points and Hit Dice. When you revert to your normal form, you return to the number of hit points you had before you transformed. However, if you revert as a result of dropping to 0 hit points, any excess damage carries over to your normal form. For example, if you take 10 damage in animal form and have only 1 hit point left, you revert and take 9 damage. As long as the excess damage doesn’t reduce your normal form to 0 hit points, you aren’t knocked unconscious.
* You can’t cast spells, and your ability to speak or take any action that requires hands is limited to the capabilities of your beast form. Transforming doesn’t break your concentration on a spell you’ve already cast, however, or prevent you from taking actions that are part of a spell, such as call lightning, that you’ve already cast.
* You retain the benefit of any features from your class, race, or other source and can use them if the new form is physically capable of doing so. However, you can’t use any of your special senses, such as darkvision, unless your new form also has that sense.
* You choose whether your equipment falls to the ground in your space, merges into your new form, or is worn by it. Worn equipment functions as normal, but the DM decides whether it is practical for the new form to wear a piece of equipment, based on the creature’s shape and size. Your equipment doesn’t change size or shape to match the new form, and any equipment that the new form can’t wear must either fall to the ground or merge with it. Equipment that merges with the form has no effect until you leave the form.

!!! Other Uses of Wild Shape

<<vtabs "[tag[Wild Shape]!tag[XGE]sort[]]">>
At 4th level, you can use your action to magically assume the shape of a beast that you have seen before of challenge rating 1/2 or lower that doesn't have a flying speed. You can use this feature twice. You regain expended uses when you finish a short or long rest.

At 8th level, you can use your action to magically assume the shape of a beast that you have seen before of challenge rating 1 or lower. You can use this feature twice. You regain expended uses when you finish a short or long rest.
At 4th level, you can use your action to magically assume the shape of a beast that you have seen before of challenge rating 1/2 or lower that doesn't have a flying speed. You can use this feature twice. You regain expended uses when you finish a short or long rest.

At 8th level, you can use your action to magically assume the shape of a beast that you have seen before of challenge rating 1 or lower. You can use this feature twice. You regain expended uses when you finish a short or long rest.
"""
''Consume Life.'' As a bonus action, the will-o’-wisp can target one creature it can see within 5 feet of it that has <<hp 0>> and is still alive. The target must succeed on a <<save Con 10>> against this magic or die. If the target dies, the will-o’-wisp regains <<heal 3d6>>.
''Ephemeral.'' The will-o’-wisp can’t wear or carry anything.
''Incorporeal Movement.'' The will-o’-wisp can move through other creatures and objects as if they were <<difficult>> terrain. It takes <<force 1d10>> if it ends its turn inside an object.
''Variable Illumination.'' The will-o’-wisp sheds <<bright "5-20'">> radius and <<dim>> light for an additional number of feet equal to the chosen radius. The will-o’-wisp can alter the radius as a bonus action.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Shock +4>>|<<lightning 2d8>> |<<reach 5>> |
| !Invisibility|The will-o’-wisp and its light magically become invisible until it attacks or uses its Consume Life, or until its concentration ends (as if concentrating on a spell). |<|
While holding this fan, you can use an action to cast the [[Gust of Wind]] spell (<<save "Spell DC" 13>>) from it. Once used, the fan shouldn’t be used again until the next dawn. Each time it is used again before then, it has a cumulative 20 percent chance of not working and tearing into useless, nonmagical tatters.
You and up to ten willing creatures you can see within range assume a gaseous form for the duration, appearing as wisps of cloud.
While in this cloud form, a creature has a flying speed of 300 feet and has resistance to damage from nonmagical weapons. The only actions a creature can take in this form are the Dash action or to revert to its normal form.
Reverting takes 1 minute, during which time a creature is [[Incapacitated]] and can’t move. Until the spell ends, a creature can revert to cloud form, which also requires the 1-minute transformation.

If a creature is in cloud form and flying when the effect ends, the creature descends 60 feet per round for 1 minute until it lands, which it does safely. If it can’t land after 1 minute, the creature falls the remaining distance.
A wall of strong wind rises from the ground at a point you choose within range.
You can make the wall up to 50 feet long, 15 feet high, and 1 foot thick. You can shape the wall in any way you choose so long as it makes one continuous path along the ground. The wall lasts for the duration.

When the wall appears, each creature within its area must make a Strength saving throw. A creature takes 3d8 bludgeoning damage on a failed save, or half as much damage on a successful one.

The strong wind keeps fog, smoke, and other gases at bay. Small or smaller flying creatures or objects can’t pass through the wall. Loose, lightweight materials brought into the wall fly upward. Arrows, bolts, and other ordinary projectiles launched at targets behind the wall are deflected upward and automatically miss. (Boulders hurled by giants or siege engines, and similar projectiles, are unaffected.) Creatures in gaseous form can’t pass through it.
While you wear these boots, you have a flying speed equal to your walking speed. You can use the boots to fly for up to <<time 4h>>, all at once or in several shorter flights, each one using a minimum of <<time 1m>> from the duration. If you are flying when the duration expires, you descend at a rate of 30 feet per round until you land.

The boots regain <<time 2h>> of flying capability for every <<time 12h>> they aren’t in use.
While wearing this cloak, you can use an action to speak its command word. This turns the cloak into a pair of bat wings or bird wings on your back for <<time 1h>> or until you repeat the command word as an action. The wings give you a flying speed of 60 feet. When they disappear, you can’t use them again for <<time "1d12 hours">>.
"""
''Keen Hearing and Smell.'' The wolf has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pack Tactics.'' The wolf has advantage on an attack roll against a creature if at least one of the wolf's allies is within 5 feet of the creature and the ally isn't incapacitated.
''Snow Camouflage.'' The wolf has advantage on Dexterity (Stealth) checks made to hide in snowy terrain.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +6>>|<<piercing 2d6+4>> |<<reach 5>> |
|~|If the target is a creature, it must scuceed on a <<save Str 14>> or be knocked [[Prone]] |<|
|^ !Cold Breath|''Recharge on 5-6''<br/>The wolf exhales a blast of freezing wind in a <<cone 15>>. Each creature in that area must make a <<save Dex 12>>, taking <fail><<cold 4d8>></fail>, or <pass><<halved>></pass>. |<|
|!Source |https://media.wizards.com/2018/dnd/dragon/23/DRA23_WintersSplendor.pdf |
|!AL Code |DDAL00-05 |
|!Duration |<<time 2h>> (<<time 3h>> with bonus objectives) |
|!Levels |1st to 4th level |

<<fold "DM Notes">>

<<vtabs "[tag[Winter's Splendor]tag[Section]nsort[order]]">>
This year’s Midwinter Gala is held in <<loc Waterdeep>>’s glamorous <<loc "Sea Ward">>. The festivities include a bustling outdoor holiday market and special performances at the <<loc "Cassalanter Villa">>, which the <<org Cassalanters>> have graciously opened to the public for the duration of the holiday.

The pleasant atmosphere is tainted when aasimar opera singer, <<per "Aria Cavatina">>, is attacked by a tiny fiend that seemingly appears out of nowhere. The <<org "City Watch">> shuts down the event, holding guests in the villa for questioning until the culprit can be identified.

The fiends wreaking havoc on the party are doing the bidding of <<per Asmodeus>>, who already holds sway over the <<org Casslanters>>. The devils have been inadvertently summoned by young <<per "Elzerina Cassalanter">>,
with whom <<per Asmodeus>> has been communicating via her toys. <<per Elzerina>> does not know that her innocent playtime has invited these devilish creatures into her home.

Will characters be able to crack Asmodeus’s puzzle and put a stop to his fiendish meddling? With a villa full of Waterdeep’s most prominent citizens and a family
with a secret so dark they’ll do anything to protect it, mayhem and mystery await this Midwinter!
! Breaking the Ice

|!Estimated Duration|<<time 20m>> |

<<htabs "[tag[Winter's Splendor]tag[Section 1]sort[order]]">>
!! Silent Night, Devil's Light

|!Estimated Duration|<<time 30m>> |

<<htabs "[tag[Winter's Splendor]tag[Section 3]sort[order]]">>
!! Danse Macabre

|!Estimated Duration|<<time 30m>> |

The characters discover a strange toy in Elzerina’s toy box that has a strange effect on Elzerina and can destroy it or remove the curse. It bears a maker’s mark that reads BLINSKY.

* ''Prerequisite.'' Characters must have discovered Elzerina’s toy chest to kick off this objective. Alternately, you may choose to have Elzerina and Terenzio play with this toy early in the adventure.

!!! Elzerina Ballerina

Among Elzerina Cassalanter’s many toys, there is an ornate round music box in the shape of an egg, about 10 inches long. The outside is a deep ruby red encrusted with small gems. Opening the egg reveals a tiny ballerina. Turning the key that juts out from the back of the egg makes the ballerina twirl slowly to the mournful melody that emits from the box.

Strangely, the tiny ballerina looks exactly like Elzerina, with blonde pigtails and wide hazel eyes. The ballerina is dressed in a white leotard, similar to Elzerina’s Midwinter Gala white dress. When the key is turned, Elzerina herself twirls until the song ends. She has no control over her body when this happens, and this occurs regardless of how far she is from the item. Her parents assume she is just being her usual self, but this compulsion to dance distresses her greatly. If Elzerina is around the characters when they discover the toy, she panics and asks them to take it from the house.

If Elzerina is absent when they discover it, they may suspect the item is cursed if they have attempted a detect magic spell while in the children’s room.

<<<
''Blinsky’s Bane''

Gadof Blinksy is a famous toymaker who resides in a place far away from Waterdeep… Barovia. Characters who make a successful DC 20 Intelligence (History) check OR a successful DC 20 Intelligence (Arcana) check, recognize Blinsky’s name and recall his reputation for making exquisite, albeit sinister, toys. How did the Cassalanters come by such an item? Tendrils of darkness from across the realms seem to be reaching out for young Elzerina.
<<<

* A successful DC 12 Intelligence (Investigation) check spots the name BLINKSY carved into the flat underside of the music box.
* An additional successful DC 14 Intelligence (Investigation) check notices that the ballerina looks startlingly like Elzerina.
* A successful DC 15 Intelligence (Arcana) check determines that the item is cursed with an enchantment that causes the subject to dance whenever the box is wound. Ultimately, if someone continues to wind the key, Elzerina would be forced to continue dancing until she dies from exhaustion.
* A successful DC 17 Intelligence (Arcana) determines that the curse can be broken by severing the link between the ballerina and the subject. Altering the ballerina’s appearance, such as changing her hair color, would work. The ballerina is not a poppet, so altering it will not alter (or injure) Elzerina. Technically, destroying it also works if the ballerina’s appearance is altered by the effort (such as a limb breaking off).

Once the curse is broken, characters can choose to leave the toy or take it. They may ask Elzerina what she wants them to do with it, and she is eager for them to take it far away. If the Cassalanter adults are approached about the toy, they say it was a gift from an acquaintance in Damara and don’t know much about it. It is worth a hefty sum of gold, however.
!! Join Us In Song

At 3 p.m., when the sun is beginning to lower in the sky, the doors of the Cassalanter Villa open. A servant of the household steps forward and heralds the start of the performance in the villa, by sounding off on a trumpet.

The crowd clusters in the Entrance Hall the servant leads them to the Ballroom on
the second floor. The doors remain open to allow the overflow audience to trickle into the villa.

* <<per "Willifort Crowelle">>, Servant.
** Male, Lawful Evil, <<mob Doppelganger>>
** He is in the form of an aging male tiefling.
** He leads the crowd to the Ballroom on the second floor.

!!! Villa Security

* ''Guards.'' The villa is well fortified.
** ''Front Door.'' 4 <<mob Guard>> flank the front door, two on each side of the interior.
** ''Ballroom.'' 6 <<mob Guard>> posted around the perimeter.
*** Hired by the <<org Cassalanters>> to prevent guests from wandering around the estate.
* ''City Watch.'' In addition to the private guards, the City Watch is on hand.
** <<per "Captain Hyustus Staget">>
*** //Male, Illuskan Human, Lawful Good, <<mob Veteran>>//
*** He is accompanied by two <<mob Guard>> under his command.

!!! The Ballroom

* ''Temporary Dias.'' Constructed next to the Cassalanters’ beautiful harpsichord, which has been transported from the main hall to the ballroom.
* <<per "Ammalia Cassalanter">> and <<per "Victoro Cassalanter">>
** Dressed in opulent winter finery, smile warmly at the crowd. 
* <<per "Terenzio Cassalanter">> and <<per "Elzerina Cassalanter">>
** 8 year old twins, squirming in their freshly-starched holiday clothes. 
** <<perception 15>> to realize <<per Elzerina>> looks anxious beyond just typical childlike ennui. She glances around the crowd, then over her shoulder, and nervously at her parents. 
** Balled in her fist is a crumpled piece of paper (a story called The Wooden Girl, ripped from one of her books).

!!! The Performance

* <<per Ammalia>> introduces the performer, opera singer <<per "Aria Cavatina">>
* <<per "Aria Cavatina">>
** //Female, Protector Aasimar, Lawful Good, <<mob "Bard, Monster">>//
** Aria performs without accompaniment. She sings an opening song, elevating a familiar holiday tune; radiant light fills the room and enraptures the audience. 
** ''Background Information.''
*** Aria is beautiful and statuesque, with vivid red hair that contrasts her silvery-white skin. When she sings, her eyes glow a mesmerizing sapphire and shimmering wings sprout from her back. Aria is famous across Faerûn and hosting her is considered a great honor. She is a soprano. 
*** Aria is warm and friendly. She comes from a long line of opera singers. 
*** In her possession is music for a song titled, Golden Wings, which has been damaged. She hopes to find someone who will help her restore it to its former glory. (See {{Winter's Splendor - Voice of an Angel||Link}}).

<<<
The singer’s voice fills the room, and her radiant light follows. It is a soft, warm light that makes the Cassalanters’ décor gleam and shimmer. Her voice is bright and clear, and you are riveted by it. The crowd watches in silence; even the ornery children have gone quiet and watch, open-mouthed.
<<<

!!! Impish Tendencies

<<per Aria>> extends her arms, heralding the start of another song, but suddenly stumbles and lets out a blood-curdling scream.

* <<perception 14>> to see a bright red <<mob Imp>> has glommed onto the back of her neck
* <<mob Imp>> attacks <<per Aria>> with its ''sting attack'', causing <<damage 25>>
** <<per Aria>> is more distressed from shock and surprise than injury.

''Party has 30 seconds of real time to act.''

* <<mob Imp>>
** Fixated on attacking <<per Aria>>, largely because of her celestial aura.
** Reacts with hostility towards characters attempting to communicate with it.
* ''If party does not act.''
** City watch defeats the imp
* ''The Crowd'' panics.
** <<per "Captain Staget">> steps forward, with a booming voice, he commands the City Watch and private guards to shut down the festivities

<<<
Captain Staget shuts the front doors, locking everyone inside. “No one is allowed to leave until we can conduct an investigation!”
<<<

* <<per "Captain Staget">> urges anyone willing to help investigate to step forward.
* <<mob Guard>> stabilizes <<per Aria>>
* ''Crowd.''
** Mostly commoners, Waterdavian nobles and Cassalanter servants.
** No one volunteers
* <<per "Captain Staget">> turns to the party, asks for their assistance.

!!! The Investigation

* <<investigation 12>> or <<pp 12>> or <<per "Captain Staget">>
** Finds a crumpled piece of paper near the <<mob Imp>> body.
** A page torn from a children's book, containing a fable called &quot;The Wooden Girl&quot;. (See {{Winter's Splendor - The Wooden Girl||Link}})

!! Lockdown in the Villa

* <<per "Captain Staget">>  permits the characters access to the <<loc "Cassalanter Villa", but <<per Ammalia>> and <<per Victoro>> protest, requesting that the characters remain limited to the main compound &mdash; they claim they wouldn’t want the characters to wander out of sight and get hurt. <<per Staget>> reluctantly acquiesces to this request.
** <<insight 17>> catches the worry masked behind the Cassalanter’s otherwise warm demeanor
*** ''DM Info.'' With the presence of a rogue imp in their home, they worry that this will cause suspicion and eventually lead to the discovery of their Asmodeus cult.

* <<per Ammalia>> draws her children to her. 
** <<perception 13>> to notice Elzerina is especially frightened. When she sees someone holding the ripped story, she lets out a squeak before clamping her hands over her mouth. 

* <<per Aria>> offers the characters <<loot "[[Bell of the Silent Carols]]">> to aid in the investigation.

!! A Puzzle with Two Paths

# Party must establish the existence of the puzzle.
# Party must then decide if they want to question the guests. Some guests will help expedite the solution, others will slow the proceedings down.

!! The Sigil Puzzle

* Party must first establish ... (//To be completed...//)
!! More Questions Than Answers
!! Silent Night, Devil's Light

|!Estimated Duration|<<time 30m>> |

<<htabs "[tag[Winter's Splendor]tag[Section 3]sort[order]]">>
!! The Winter Market

<<<
Wheels of carriages and drays crunch over the freshly-fallen snow, delivering visitors from across the city to the Sea Ward. Despite the frigid temperature, the atmosphere is warm and jovial. Red velvet-covered tents line Delzorin and Diamond Streets; merchants offer treats and trinkets. The air is filled with the voices of carolers and the scents of spiced pastries and mulled wine.
<<<

|max top|k
| !Area Information (<<loc "Waterdeep, Sea Ward">>) |<|
|!Dimensions & Terrain |<<loc "Delzorin Street">> and <<loc "Diamond Street">> are both closed to traffic.<br/>The streets have been cleared of snow, but the snow is banked on the sidewalks and the roofs of the villas that line the street.<br/>Throughout the day, snow falls in intermittent bursts, adding a fresh coat to the ground. |
|!Lighting |<<bright>> The sunlight is feeble behind snow clouds, but the rays catch the light of the freshly-fallen snow and it is quite bright outside. <br/><<dim>> The light under the tents is dimmer, lit by candles and magic lanterns. |

* ''Midwinter Gala''
** An extravagant affair that lasts for a tenday
* ''NPC Merchants.'' Are selling various goods (//See below//)
** Will gladly answer questions about 
*** The Sea Ward
*** The Midwinter Gala 
*** The upcoming performance at the <<org Cassalanters>>' <<loc "Cassalanter Villa">>
**** Everyone is excited
**** Party is ''strongly urged'' to watch the performance.
** Are equipped with <<book "Volo’s Waterdeep Enchiridion">> (See ''Waterdeep: Dragon Heist, page 163'').
** About <<per "Aria Cavatina">>, all speak highly of the visiting bard
*** //Female, Protector Aasimar, Lawful Good, <<mob "Bard, Monster">>//
*** Her angelic voice is famous. 

!!! NPC Merchants

* <<per Wizdil>>
** //Male, Gnome, Chaotic Good, <<mob Commoner>>//
** Sells cups of mulled wine, ale, or beer for <<loot 5cp>>.
** Wizdil staves off the cold by imbibing from his own supply and is in quite good spirits.
* <<per Merry>>
** //Female, Halfling, Lawful Good, <<mob Commoner>>//
** Sells pastries, cookies, and cakes for <<loot 10cp>>.
** Merry is passionate about baking and refers to her offerings as &quot;positively scrummy!&quot;

* <<per Hildegard>>
** //Female, Human, Neutral, <<mob Commoner>>//
** Sells beautiful knitwear (hats, scarves, gloves, and small knit animals) for <<loot 1gp>>. 
** She is actively knitting an ornate cowl when the characters approach.

* <<per Vela>>
** //Female, Human, Chaotic Good, <<mob "Bard, Monster">>//
** Sells intricately-crafted wooden instruments; available at her table are 
*** Violin
*** Viola
*** Lute
*** Hurdy-gurdy (//rare//)
*** Balalaika (//rare//)
** Each instrument costs <<loot 100gp>>
** Vela plucks at the balalaika to the same tune of the songs sung by the carolers.

* <<per Pavel>> 
** //Male, Half-Elf, Neutral, <<mob Commoner>>//
** Sells an array of fine stationary — notebooks, holiday cards, blank scrolls, quills, and monogram wax stamps. 
** Each item costs <<loot 3gp>>.
!! The Wooden Girl
!!!From The Faerûn Child’s Book of Fables

The girl’s name was Eliza and she was brought to life in the puppet-maker’s workshop. Like most girls, Eliza was equipped with limbs and a face and, of course, a heart. The puppet maker, Sophie, crafted Eliza with loving detail. Sophie perched Eliza in the window of the shop, where she could wave to the passers-by and enjoy the
view of the ocean in the distance.

On the first morning of Midwinter, Eliza gazed longingly through the window, watching the white caps fold over the sea. Snow began to fall, dotting the shop windows and obscuring her vision. Eliza grew sad and wistful. She wanted to leave the shop, but knew that she could not.

Suddenly the snowdrops on the glass began to melt. A vivid orange glow filled Eliza’s sight. On the other side of the window stood an old man, face shrouded in a torn scarf, holding a candle. ''Elzerina'' was fearful, for Sophie had always told her: wooden girls must stay away from fire. Sophie told Elzerina about the ''wooden snake'' she had crafted as a child. When the snake was brought to life, it slithered toward the hearth, seeking warmth. A stray ember ignited the snake, and it withered to ashes. This was not the only warning; Sophie also told Elzerina about the set of ''pick-up sticks'' she had crafted when she was the woodworker’s apprentice. Pleased with her
work, Sophie rubbed two sticks together to sand away the splinters — but the friction sparked, and the sticks burnt to cinders.

But the man’s flame was low on the wick, and he peered at her through the glass. //Little wooden girl, why are you so sad?//

//I wish to see the sea beyond this pane of glass, she said. When it snows, the drops blur the window, and I feel trapped.//

//What if I took you from your mount? he said. Would you like that?//

Elzerina frowned. //My maker warned me not to go outside, for I could get lost. She says little girls like me get lost in big cities.//

But the man persisted. //Surely she did not create you just to keep you trapped here forever. What if you fetched her a gift for the holiday?//

This filled Elzerina with joy. //Oh, yes! I should so love to bring my maker a present. And perhaps I will get a quick glimpse of the sea.//

He stepped into the shop and lifted her from her mount. He marched through the city and she reveled in the freedom. But he strode not to the sea, but toward the ''City of the Dead''.

It was not the coovl blue ocean she eventually saw before her, but a scene awash in gray. Perhaps if she blurred her sight, she could pretend that the feeble sun glinting off of the snow-slick tombstones was the white-capped surface of the sea. But Elzerina knew already that she had made a terrible mistake. She suddenly longed for the puppet-maker’s workshop, for the stoic company of ''alphabet blocks'' and sets of dice and intricately-carved spinning tops and tiny ballerinas who danced but never spoke. The man wove through the rows of stones and sat at a ''circle embedded in the ground, an altar unmarked and unnamed''. But it had been desecrated already;
Elzerina saw the remnants of a fire that once burned, the debris of used tinder.

The man pulled away his scarf and grinned at her, an evil smile matched by red eyes that glinted with sadistic pleasure. He placed her atop the ashes and pulled a matchbook from his shabby coat pocket. He had the tool but not the fuel &mdash; until he had found the wooden girl in the workshop window, made from the choicest wood for burning, the perfect size for kindle on a long winter night.

The man struck an oiled match tip and the flame roared to life, a curious gradient of deep navy and violent orange. And as the blue heart of the flame engulfed her, Eliza thought of both the azure sea she would never meet and the puppet-maker’s kind cornflower eyes, and longed for their cool, ''dousing touch''.
!! Voice of an Angel

|!Estimated Duration|<<time 30m>> |

Visiting performer Aria Cavatina enlists the characters’ help in completing an ancient
musical arrangement.

Aria is from a long line of aasimar bards, whose celestial blood is said to come from Milil. A scroll of an ancient song called Golden Wings has been passed down from generation to generation in the Cavatina family. Aria’s family lore claims that the song has magical properties — when sung or read, the song summons a celestial creature to the aid of the bard who performs it. Unfortunately, part of the scroll was burned when Aria’s great-grandmother, Elea, faced off against a dragon many years ago. Aria hopes to compose a new end to the song and restore its power.

<<<
"""
''Golden Wings''
//Like a candle, I burn//
//In the glow of your radiance//
//Like a plucked string, I learn//
//The bright hum of your resonance//

//Like a pilgrim, I bow//
//Humbled by your divinity//
//Will you come to me now?//
//I send you my prayer, my plea//

//Lifted voice, lowered eyes//
//Prostrated here on hands and knees…//
"""
<<<

* ''Reward creativity at the table.'' Players can come up with two new lines of lyrics that fit both the rhyming meter and the theme of the song. See Appendix 9 for the annotated version of the song. The song is comprised of three four-line stanzas that alternate in meter. If the characters come up with appropriate lyrics, they may attempt a DC 13 Charisma (Performance) check with Advantage to confirm that the addition is a good fit.
* ''Prompt ability checks.'' The characters must succeed at two separate checks without aid: a successful DC 13 Wisdom (Insight) check results in crafting appropriate lyrics, and a successful DC 15 Charisma (Performance) check results in the correct meter. Both successes ensure the song is successfully completed. If the characters succeed at one part but fail at the other, Aria offers her assistance and the characters roll with advantage.

When the song is successfully completed, Aria sings it and the act summons a celestial gold pseudodragon. Aria gives the characters a heartfelt thanks, and awards characters with a copy of the song so that it may never be lost again (see Appendix 10).

!! Where There's Smoke...

|!Estimated Duration|<<time "90 to 120 minutes">> |

<<htabs "[tag[Winter's Splendor]tag[Section 2]sort[order]]">>
Wish is the mightiest spell a mortal creature can cast. By simply speaking aloud, you can alter the very foundations of reality in accord with your desires.

The basic use of this spell is to duplicate any other spell of 8th level or lower. You don’t need to meet any requirements in that spell, including costly components. The spell simply takes effect.
Alternatively, you can create one of the following effects of your choice:

* You create one object of up to 25,000 gp in value that isn’t a magic item. The object can be no more than 300 feet in any dimension, and it appears in an unoccupied space you can see on the ground.

* You allow up to twenty creatures that you can see to regain all hit points, and you end all effects on them described in the greater restoration spell.

* You grant up to ten creatures that you can see resistance to a damage type you choose.

* You grant up to ten creatures you can see immunity to a single spell or other magical effect for 8 hours. For instance, you could make yourself and all your com panions immune to a lich’s life drain attack.

* You undo a single recent event by forcing a reroll of any roll made within the last round (including your last turn). Reality reshapes itself to accommodate the new result. For example, a wish spell could undo an opponent’s successful save, a foe’s critical hit, or a friend’s failed save. You can force the reroll to be made with advantage or disadvantage, and you can choose whether to use the reroll or the original roll.

You might be able to achieve something beyond the scope of the above examples. State your wish to the DM as precisely as possible. The DM has great latitude in ruling what occurs in such an instance; the greater the wish, the greater the likelihood that something goes wrong. This spell might simply fail, the effect you desire mightonlybepartlyachieved,oryoumightsuffersome unforeseen consequence as a result of how you worded the wish. For example, wishing that a villain were dead might propel you forward in time to a period when that villain is no longer alive, effectively removing you from the game. Similarly, wishing for a legendary magic item or artifact might instantly transport you to the presence of the item’s current owner.

The stress of casting this spell to produce any effect other than duplicating another spell weakens you. After enduring that stress, each time you cast a spell until you finish a long rest, you take 1d10 necrotic damage per level of that spell. This damage can’t be reduced or prevented in any way. In addition, your Strength drops to 3, if it isn’t 3 or lower already, for 2d4 days. For each of those days that you spend resting and doing nothing more than light activity, your remaining recovery time decreases by 2 days. Finally, there is a 33 percent chance that you are unable to cast wish ever again if you suffer this stress.
''Prerequisite:'' 15th level

You can see the true form of any shapechanger or creature concealed by illusion or transmutation magic while the creature is within 30 feet of you and within line of sight.
As a wizard, you gain the following class features.

!! Hit Points
"""
''Hit Dice:'' 1d6 per wizard level
''Hit Points at 1st Level:'' 6 + your Constitution modifier
''Hit Points at Higher Levels:'' 1d6 (or 4) + your Constitution modifier per wizard level after 1st
"""

!! Proficiencies
"""
''Armor:'' None
''Weapons:'' Daggers, darts, slings, quarterstaffs, light crossbows
''Tools:'' None
''Saving Throws:'' Intelligence, Wisdom
''Skills:'' Choose two from Arcana, History, Insight, Investigation, Medicine, and Religion
"""

!! Equipment
You start with the following equipment, in addition to the equipment granted by your background:

"""
(a) a quarterstaff or (b) a dagger
(a) a component pouch or (b) an arcane focus
(a) a scholar’s pack or (b) an explorer’s pack
A spellbook
"""

!! Subclasses

<<list-box "[tag[Wizard]tag[Subclass]sort[]]">>

<<include "Wizard Advancement Table">>

---

<<include "Wizard Ability">>
<<sections-vertical "[[Wizard Spellcasting]] [[Arcane Recovery]] [[Cantrip Formulas]] [[Arcane Tradition]] [[Wizard Ability Score Improvement]] [[Spell Mastery]] [[Signature Spells]]">>
When you reach 4th level, and again at 8th, 12th, 16th, and 19th level, you can increase one ability score of your choice by 2, or you can increase two ability scores of your choice by 1. As normal, you can’t increase an ability score above 20 using this feature.

Using the optional feats rule, you can forgo taking this feature to take a feat of your choice instead.
| !Level | !Proficiency Bonus | !Features | !Cantrips Known | !1st | !2nd | !3rd | !4th | !5th | !6th | !7th | !8th | !9th |
| !1st | +2 |[[Spellcasting|Wizard Spellcasting]], [[Arcane Recovery]] | 3 | 2 | — | — | — | — | — | — | — | — |
| !2nd | +2 |[[Arcane Tradition]] | 3 | 3 | — | — | — | — | — | — | — | — |
| !3rd | +2 |[[Cantrip Formulas]]  | 3 | 4 | 2 | — | — | — | — | — | — | — |
| !4th | +2 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 4 | 4 | 3 | — | — | — | — | — | — | — |
| !5th | +3 | — | 4 | 4 | 3 | 2 | — | — | — | — | — | — |
| !6th | +3 |Arcane Tradition Feature | 4 | 4 | 3 | 3 | — | — | — | — | — | — |
| !7th | +3 | — | 4 | 4 | 3 | 3 | 1 | — | — | — | — | — |
| !8th | +3 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 4 | 4 | 3 | 3 | 2 | — | — | — | — | — |
| !9th | +4 | — | 4 | 4 | 3 | 3 | 3 | 1 | — | — | — | — |
| !10th | +4 |Arcane Tradition Feature | 5 | 4 | 3 | 3 | 3 | 2 | — | — | — | — |
| !11th | +4 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !12th | +4 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 2 | 1 | — | — | — |
| !13th | +5 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !14th | +5 |Arcane Tradition Feature | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | — | — |
| !15th | +5 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !16th | +5 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | — |
| !17th | +6 | — | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 1 | 1 | 1 |
| !18th | +6 |[[Spell Mastery]] | 5 | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 |
| !19th | +6 |[[Ability Score Improvement|Wizard Ability Score Improvement]] | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 1 | 1 | 1 |
| !20th | +6 |[[Signature Spells]] | 5 | 4 | 3 | 3 | 3 | 3 | 2 | 2 | 1 | 1 |

<<spelltable "[[Acid Splash]] [[Blade Ward]] [[Booming Blade]] [[Chill Touch]] [[Control Flames]] [[Create Bonfire]] [[Dancing Lights]] [[Fire Bolt]] [[Friends]] [[Frostbite]] [[Green-Flame Blade]] [[Gust]] [[Infestation]] [[Light]] [[Lightning Lure]] [[Mage Hand]] [[Mending]] [[Message]] [[Mind Silver]] [[Minor Illusion]] [[Mold Earth]] [[Poison Spray]] [[Prestidigitation]] [[Ray of Frost]] [[Shape Water]] [[Shocking Grasp]] [[Sword Burst]] [[Thunderclap]] [[Toll the Dead]][[True Strike]]">>
As a student of arcane magic, you have a spellbook containing spells that show the first glimmerings of your true power. See Spells Rules for the general rules of spellcasting and the Spells Listing for the wizard spell list.

!!! Cantrips

At 1st level, you know three cantrips of your choice from the wizard spell list. You learn additional wizard cantrips of your choice at higher levels, as shown in the Cantrips Known column of the Wizard table.

!!! Spellbook

At 1st level, you have a spellbook containing six 1st-level wizard spells of your choice. Your spellbook is the repository of the wizard spells you know, except your cantrips, which are fixed in your mind.

!!! Preparing and Casting Spells

The Wizard table shows how many spell slots you have to cast your wizard spells of 1st level and higher. To cast one of these spells, you must expend a slot of the spell’s level or higher. You regain all expended spell slots when you finish a long rest.

You prepare the list of wizard spells that are available for you to cast. To do so, choose a number of wizard spells from your spellbook equal to your Intelligence modifier + your wizard level (minimum of one spell). The spells must be of a level for which you have spell slots.

For example, if you’re a 3rd-level wizard, you have four 1st-level and two 2nd-level spell slots. With an Intelligence of 16, your list of prepared spells can include six spells of 1st or 2nd level, in any combination, chosen from your spellbook. If you prepare the 1st-level spell magic missile, you can cast it using a 1st-level or a 2nd-level slot. Casting the spell doesn’t remove it from your list of prepared spells.

You can change your list of prepared spells when you finish a long rest. Preparing a new list of wizard spells requires time spent studying your spellbook and memorizing the incantations and gestures you must make to cast the spell: at least 1 minute per spell level for each spell on your list.

!!! Spellcasting Ability

Intelligence is your spellcasting ability for your wizard spells, since you learn your spells through dedicated study and memorization. You use your Intelligence whenever a spell refers to your spellcasting ability. In addition, you use your Intelligence modifier when setting the saving throw DC for a wizard spell you cast and when making an attack roll with one.

''Spell save DC ='' 8 + your proficiency bonus + your Intelligence modifier

''Spell attack modifier ='' your proficiency bonus + your Intelligence modifier

!!! Ritual Casting

You can cast a wizard spell as a ritual if that spell has the ritual tag and you have the spell in your spellbook. You don’t need to have the spell prepared.

!!! Spellcasting Focus

You can use an arcane focus (see the Adventuring Gear section) as a spellcasting focus for your wizard spells.

!!! Learning Spells of 1st Level and Higher

Each time you gain a wizard level, you can add two wizard spells of your choice to your spellbook for free. Each of these spells must be of a level for which you have spell slots, as shown on the Wizard table. On your adventures, you might find other spells that you can add to your spellbook (see the “Your Spellbook” sidebar).

<<include "Spellbook">>
<<htabs "[tag[Wizard Spells]sort[order]]">>
R0lGODlhAAEAAaEBAAICAv///////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAAAAAQABAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1KpVCABct1xDtguufsNkaFZbTi/P6jaS7Y4Px/L6j45B2/cLvMvPFwj3AhjIV5gyaGiIiNK4WKcHOUlZaXmJmam5ydnp+QkaKjpKWmp6ipqqugp05qrIWvk6S8sBG8tEq1ub4Yr7tBs8myf5qySM/Gqc9PiQ/Oy7bHQbAW3dLL1D7XDdnV2EndDt/U01Tl4ehS4unK6eTBHsDtx+oTvfhNzLi38sr3GvH7NdtvgJnBaQ26OEB4kQVDhMAcOGWCayM3jAIsX+OxglatS4sQdILw8vKgtZMSKDaCT7dETJYyTLjC5VwvRR0qSElzd15EQws8HInjd+ZtxmMihRnyCVHv23NGZTpfCiipx6LpxVGFCBZi22FUdXr+PCXpVZ1qxUniStqT3LNoDbt2vjtjVKN8dYoSfzcsTrN9/ewLkGE15T77ATfYoXM25c2DBkhJInO6xsOSXgzJrtcm61+XNnp6LnDC0N2iZqcJ5X10Xq+i/s2Dj70jZN+nbt3Lq12e6dWivwGr+HwwVr3Pfs5MR5n1ievLgK6cyfCgdBvfpd5M+za/c+QrV2stA3SBI/fjt3D9HQp5cLHqCv1tHjE5tvv35+C8r+6Bv3H09/+w13mj1VvZdUeQEmBt96wBXI34EDlhaagY+51xuEFTyjXnoA7lTVh6KJCAE0DTp3G4nOfOXhhNWw2KKCE3zl4IMyzghjjOHlOB6KFp6DoI8RAhnkjS9mheCJItCYpIsrElnkdUdC+Z6QOFJZpZFPppVkg9jxGKUt5F3TpVf7DIJkmTQNeVKaat7XF5ZvLqiSnHNOGZGdd25ZJ5d7ghiQm3+WWJKeg3pUqJ+HrgSVoIvWlJChj57Ij6OTWhepopdi2qemmzJm6aegSrooPKFeauqpj3Koaqk0HjjpGK8+tqqsszI4aHu3YtbkMLviquZDv1bYo7DDakj+4KjHOklbiMtiyByHlD5b43/SUsssaiZO+2yX0nLbbZRjYWtls7iSm+2IP6Gb7mc5sasihTbBi2xsldIbr7p44EtstPz2m+G/tMYoMMC6FQxssQiXa+PCfy5cbZYFu/pvrPx+FzGn7Co8W8Uco3exxBBDm+zIJJdssparpcywuSxnHPDLZb4M88Eyi0uzyDnrvDPBNKvM2c8n2yv00CsX3a5iSLfn79I16+s0xlFLvTTVVVfntJTuZv301lM3/bW1WWPNNdljg321fmGjvHbMZ4tdttlpW/1zr3XP3HOwJucKMcUCoxqyqPBuOia1hCd47OGQDqs4o4w37vitkEM3xOTkfHpq+eJzZf6iegZzXvjnoGts9OiI1mv66UCnznrrrr8Oe+yyz0577bbfjnvuuu/Ou+kFAAA7
"""
''Keen Hearing and Smell.'' The wolf has advantage on Wisdom (Perception) checks that rely on hearing or smell.
''Pack Tactics.'' The wolf has advantage on attack rolls against a creature if at least one of the wolf's allies is within 5 feet of the creature and the ally isn't incapacitated.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
|^ !<<melee Bite +4>>|<<piercing 2d4+2>> |<<reach 5>> |
|~|If the target is a creature, it must succeed on a <<save Str 11>> or be knocked [[Prone]]. |<|
Woodcarver’s tools allow you to craft intricate objects from wood, such as wooden tokens or arrows.

''Components.'' Woodcarver’s tools consist of:

* a knife
* a gouge
* a small saw

''Arcana, History.'' Your expertise lends you additional insight when you examine wooden objects, such as figurines or arrows.

''Nature.'' Your knowledge of wooden objects gives you some added insight when you examine trees.

''Repair.'' As part of a short rest, you can repair a single damaged wooden object.

''Craft Arrows.'' As part of a short rest, you can craft up to five arrows. As part of a long rest, you can craft up to twenty. You must have enough wood on hand to produce them.

| !Activity | !DC |
|!Craft a small wooden figurine | 10 |
|!Carve an intricate pattern in wood | 15 |
You and up to five willing creatures within 5 feet of you instantly teleport to a previously designated sanctuary.
You and any creatures that teleport with you appear in the nearest unoccupied space to the spot you designated when you prepared your sanctuary (see below). If you cast this spell without first preparing a sanctuary, the spell has no effect.

You must designate a sanctuary by casting this spell within a location, such as a temple, dedicated to or strongly linked to your deity. If you attempt to cast the spell in this manner in an area that isn’t dedicated to your deity, the spell has no effect.
"""
''Keen Hearing and Smell.'' The worg has advantage on Wisdom (Perception) checks that rely on he aring or smell.
"""
[img[divider.png]]

| !<<action>> Actions |<|<|
|^ !<<melee Bite +5>>|<<piercing 2d6+3>> |<<range 5>> |
|~|If target is a creature, it must succeed on a <<save Str 13>> or be knocked [[Prone]] |<|
"""
''Incorporeal Movement.'' The wraith can move through other creatures and objects as if they were <<difficult>> terrain. It takes <<force 1d10>> if it ends its turn inside an object.
''Sunlight Sensitivity.'' While in sunlight, the wraith has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee "Life Drain" +6>>|<<necrotic 4d8+3>> |<<reach 5>> |
|~|The target must succeed on a <<save Con 14>> or its hit point maximum is reduced by an amount equal to the damage taken. This reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0. |<|
| !Create Specter|The wraith targets a humanoid within <<range 10>> of it that has been dead for no longer than <<time 1m>> and died violently. The target’s spirit rises as a <<mob Specter>> in the space of its corpse or in the nearest unoccupied space. The <<mob Specter>> is under the wraith’s control. The wraith can have no more than seven specters under its control at one time. |<|
''Multiattack.'' The wyvern makes two attacks: one with its bite and one with its stinger. While flying, it can use its claws in place of one other attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 2d6+4>> |<<reach 10>> |
| !<<melee Claws +7>>|<<slashing 2d8+4>> |<<reach 5>> |
| !<<melee Stinger +7>>|<<piercing 2d6+4>> |<<reach 10>> |
|~|The target must make a <<save Con 15>>, taking <fail><<poison 7d6>></fail>, or <pass><<halved>></pass>. |<|
"""
''Price per Dose:'' 1,200 gp
"""

This poison must be harvested from a dead or [[Incapacitated]] wyvern. 

* A creature subjected to this poison must make a <<save Con 15>>
** <fail><<poison 7d6>></fail>
** <pass><<halved>></pass>
"""
''Earth Glide.'' The xorn can burrow through nonmagical, unworked earth and stone. While doing so, the xorn doesn’t disturb the material it moves through.
''Stone Camouflage.'' The xorn has advantage on Dexterity (Stealth) checks made to hide in rocky terrain.
''Treasure Sense.'' The xorn can pinpoint, by scent, the location of precious metals and stones, such as coins and gems, within 60 feet of it.
"""
<<divider>>
''Multiattack.'' The xorn makes three claw attacks and one bite attack.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Claw +6>>|<<slashing 1d6+3>> |<<reach 5>> |
| !<<melee Bite +6>>|<<piercing 3d6+3>> |<<reach 5>> |
"""
''Amphibious.'' The dragon can breathe air and water.
"""
<<divider>>
''Multiattack.'' The dragon makes three attacks: one with its bite and two with its claws.

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Bite +7>>|<<piercing 2d10+4>>+<<acid 1d8>> |<<reach 10>> |
| !<<melee Claw +7>>|<<slashing 2d6+4>> |<<reach 5>> |
| !Acid Breath|''Recharge on 5–6''<br/>The dragon exhales acid in a 30-foot line that is 5 feet wide. Each creature in that line must make a <<save Dex 14>>, taking <<acid 11d8>> on a failed save, or <<halved>> on a successful one. |<|
"""
''Undead Fortitude.'' If damage reduces the zombie to <<hp 0>>, it must make a <<save Con "5+damage taken">>, unless the damage is <<radiant radiant>> or from a ''critical hit''. On a success, the zombie drops to <<hp 1>> instead.
"""
<<divider>>

|max top|k
| !<<action>> Actions |<|<|
| !<<melee Slam +3>>|<<bludgeoning 1d6+1>> |<<reach 5>> |
You create a magical zone that guards against deception in a 15-foot-radius sphere centered on a point of your choice within range. Until the spell ends, a creature that enters the spell's area for the first time on a turn or starts its turn there must make a Charisma saving throw. On a failed save, a creature can't speak a deliberate lie while in the radius. You know whether each creature succeeds or fails on its saving throw.

An affected creature is aware of the spell and can thus avoid answering questions to which it would normally respond with a lie. Such a creature can be evasive in its answers as long as it remains within the boundaries of the truth.